執行 top -n1 | 時游標消失頭
跑步時
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 $
特別是,開頭的序列
0x1b5b3f
是ANSI 轉義序列,它們實際上是元數據,用於控制游標位置和文本顏色等內容。特別是,在頂部輸出的第一行的開頭,有
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
在我的系統上留下一個游標。