`top -n1|' を実行するとカーソルが消えます。

`top -n1|' を実行するとカーソルが消えます。

走っている間

top -n1 | head

端末のカーソルが消えます。走ればtop -n1戻ってきます。

gnome-terminaltilixUbuntu 16.04およびCentOS 7.5でテストされました。


この問題なく実行すると、出力の終わりにカーソルが再び表示されるように見えますtop -n1 | tailが、これは印刷時にのみ発生しません。tophead

原因は何ですか?カーソルをより適切に復元する方法は?

答え1

IMHO、最良の方法は、他のプログラムやファイルへのパイプなどの非対話型ユースケースで使用するように設計されたtop「バッチ」モード(フラグ)を使用することです。-b

だからこれ

top -n1 -b | head

カーソルがなければシェルを離れません。

についてはカーソルが消えたのはなぜですか?...

topインタラクティブなプログラムなので、入力を受け取り、項目をスクロールするなどの操作を実行するために、端末を「乱雑に」します。隠れるカーソル。

終了すると、呼び出される前に見つかったカーソルと表示状態を復元する必要があります。制御コード端末自体に。

コマンドをパイピングすると、headこの制御コードは失敗します(headデフォルトでは最初の10行だけが印刷され、両方の出力topと端末の状態を復元するための制御コードは常に> 10行です)。

実際にhead印刷するのに十分な行を与えると、カーソルが表示されます!

例えば、

top -n1 | head -n 100

私のシステムにカーソルが残っています。

答え2

この動作はどこでも再現できませんが、Ubuntu 18.04では発生します。


最上位出力の16進ダンプを調べることをお勧めします。

$ 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。 Wikipediaページによると、これはカーソルを隠して表示するのに対応するコードです。

top -n1出力にパイプを渡すと、ターミナルはhead最初はhide-cursorコマンドを受け取りますが、最後はshow-cursorコマンドを受け取りません。

@MrShunzは適切な-bオプションの使用を提案するのがtop正しいです。このオプションは、最上位出力ですべてのANSIエスケープシーケンスを無効にし、通常のASCII印刷可能テキストのみを出力します。次の実行top中はカーソルが破損しません-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.
$ 

関連情報