Terminal

執行 top -n1 | 時游標消失頭

  • September 18, 2018

跑步時

top -n1 | head

終端的游標消失。跑步top -n1會把它帶回來。

在 Ubuntu 16.04 和 CentOS 7.5 中gnome-terminal測試。tilix


執行top -n1 | tail沒有這個問題,所以我認為,輸出末尾的一些東西讓游標重新出現,這在列印唯一top時沒有執行。head

是什麼原因造成的,我怎樣才能更優雅地取迴游標?

我無法在任何地方重新創建這種行為,但它確實出現在 Ubuntu 18.04


檢查頂部輸出的十六進制轉儲是有益的:

$ top -n1 | head -n1 | xxd
00000000: 1b5b 3f31 681b 3d1b 5b3f 3235 6c1b 5b48  .[?1h.=.[?25l.[H
00000010: 1b5b 324a 1b28 421b 5b6d 746f 7020 2d20  .[2J.(B.[mtop - 
00000020: 3133 3a34 333a 3034 2075 7020 3120 6d69  13:43:04 up 1 mi
00000030: 6e2c 2020 3120 7573 6572 2c20 206c 6f61  n,  1 user,  loa
00000040: 6420 6176 6572 6167 653a 2030 2e38 312c  d average: 0.81,
00000050: 2030 2e35 342c 2030 2e32 321b 2842 1b5b   0.54, 0.22.(B.[
00000060: 6d1b 5b33 393b 3439 6d1b 2842 1b5b 6d1b  m.[39;49m.(B.[m.
00000070: 5b33 393b 3439 6d1b 5b4b 0a              [39;49m.[K.
$ top -n1 | tail -n1 | xxd
00000000: 1b5b 3f31 326c 1b5b 3f32 3568 1b5b 4b    .[?12l.[?25h.[K
$ 

特別是,開頭的序列0x1b5b3fANSI 轉義序列,它們實際上是元數據,用於控制游標位置和文本顏色等內容。

特別是,在頂部輸出的第一行的開頭,有ESC [?25l,而在最後一行的末尾是ESC [?25h。根據維基百科頁面,這些是隱藏和顯示游標的相應程式碼。

通過將top -n1輸出傳送到head,終端將在開始時收到 hide-cursor 命令,但在結束時不會收到 show-cursor 命令,因此游標將保持不可見,直到某些其他操作再次將其打開。

@MrShunz 建議使用該-b選項top是正確的。此選項禁用 top 輸出中的所有 ANSI 轉義序列,而只是輸出純 ASCII 可列印文本。top在執行with期間不會損壞游標-b

$ top -b -n1 | head -n1 | xxd
00000000: 746f 7020 2d20 3133 3a35 393a 3236 2075  top - 13:59:26 u
00000010: 7020 3138 206d 696e 2c20 2031 2075 7365  p 18 min,  1 use
00000020: 722c 2020 6c6f 6164 2061 7665 7261 6765  r,  load average
00000030: 3a20 302e 3134 2c20 302e 3036 2c20 302e  : 0.14, 0.06, 0.
00000040: 3037 0a                                  07.
$ 

恕我直言,最好的方法是top使用“批處理”模式(-b標誌),該模式旨在用於非互動式案例,例如管道到另一個程序或文件。

所以這

top -n1 -b | head

不會在沒有游標的情況下離開外殼。

至於為什麼游標消失了……

由於top是一個互動式程序,它與終端“混淆”以獲取輸入、滾動內容等,並隱藏游標。

終止時,它必須恢復呼叫前的游標和顯示狀態,它通過向終端本身發送一個或多個控制程式碼來實現。

通過管道傳遞命令head,此控制程式碼將無法通過(head預設情況下僅列印前 10 行,並且兩者的輸出top以及用於恢復終端狀態的控制程式碼始終 > 10 行)。

事實上,如果你給head了足夠多的行來列印,游標就會出現!

例如,

top -n1 | head -n 100

在我的系統上留下一個游標。

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