為什麼 ‘cal’ 使用奇怪的 08 / ^H / b 終端程式碼來突出顯示,它是如何工作的?
在 Linux 上執行 cal 時,當月的輸出將反轉影片突出顯示當天。當我將該輸出發送到 hexdump -c 時,我得到了一些有趣的結果:
0000000 N o v e m b e r 2 0 1 6 0000010 \n S u M o T u 0000020 W e T h F r S a \n 0000030 1 2 _ \b _ \b 3 0000040 4 5 \n 6 7 0000050 8 9 1 0 1 1 1 2 \n 0000060 1 3 1 4 1 5 1 6 1 7 1 0000070 8 1 9 \n 2 0 2 1 2 2 0000080 2 3 2 4 2 5 2 6 \n 2 7 0000090 2 8 2 9 3 0 00000a0 \n 00000b0 \n 00000bc
如您所見,在今天突出顯示的“3”之前列印了一個不可見的 _\b \b 序列。 是下劃線(ASCII 十六進制中的 5F)和 \b 是 ASCII 十六進制中的 Ctrl-H 或 08。這是什麼?我知道有很多不起眼的終端程式碼,但我希望它使用更標準的東西,比如 \e[7m. 更奇怪的是,我無法通過使用標準 printf 函式(例如以下命令之一)列印出相同的字元來重現 cal 的相同行為:
/usr/bin/printf "1 2 _\b _\b3 4 5\n" /usr/bin/printf "1 2 _^H _^H3 4 5\n"
其中 ^H 是通過按 Ctrl-V Ctrl-H 生成的。但是這些都不會產生與 cal 相同的反向影片輸出。我什至嘗試編寫一個小 C 程序來做到這一點。我也嘗試過使用 echo -e。有趣的是,雖然它不會反轉終端中的影片,但如果我從 less -R 管道輸出,它會將其顏色更改為黃色並加下劃線。在其他終端上我試過它只是強調它。這幾乎看起來像是過度使用,但如果我使用 _ 以外的字元,它就不起作用,這讓我認為 _\b 是一個單一的程式碼序列。那麼該角色的影片又是如何反轉的呢?
對此有任何見解嗎?
手冊頁說 cal 的輸出應該是原始 Unix cal 命令的位兼容版本。所以我只能假設這是一些古老的程式碼。
Ctrl-H
是退格,它將游標向左移動一步。在過去的美好時光中,發送下劃線、退格和其他字元是在硬拷貝(“紙質”)終端上為某些內容加下劃線的方式。這用於在 的輸出中突出顯示目前日期cal
。我的
cal
程序在執行時konsole
不輸出此序列。如果我執行script -c cal
並檢查生成的typescript
文件,我可以看到 cal 程序使用轉義序列<esc>[7m
切換到反模式影片。