Escape-Characters

為什麼 ‘cal’ 使用奇怪的 08 / ^H / b 終端程式碼來突出顯示,它是如何工作的?

  • June 9, 2018

在 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切換到反模式影片。

引用自:https://unix.stackexchange.com/questions/320871