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


11

実行中

top -n1 | head

端末のカーソルが消えます。実行するtop -n1と元に戻ります。

でテストgnome-terminalし、tilixUbuntuの16.04とCentOSの7.5に。


実行中にtop -n1 | tailこの問題は発生しないため、top出力の最後にカーソルが再表示されますが、これはhead唯一の印刷では実行されません。

何が原因で、カーソルをよりエレガントに戻すにはどうすればよいですか?


1
ランニングで戻すこともできtput cnormます。(経由
pLumo 2018

回答:


5

どこでもこの動作を再現することはできませんでしたが、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
$ 

特に、開始するシーケンス0x1b5b3fANSIエスケープシーケンスで、カーソルの位置やテキストの色などを制御するメタデータです。

特に、一番上の出力の最初の行の始めの方にはがESC [?25lあり、最後の行の終わりの方にはがありESC [?25hます。ウィキペディアのページにあるように、これらはカーソルを隠したり表示したりするためのそれぞれのコードです。

top -n1出力をheadにパイピングすることにより、端末は最初にhide-cursorコマンドを受け取りますが、最後にshow-cursorコマンドは受け取りません。したがって、カーソルは他のアクションが再びオンになるまで見えません。

@MrShunzが提案する-bオプションを使用することをお勧めしますtop。このオプションは、topの出力ですべてのANSIエスケープシーケンスを無効にします。代わりに、プレーンなASCII印刷可能テキストを出力します。topwith の実行中にカーソルが害されることはありません-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.
$ 

すばらしい回答、ありがとう。カーソルprintf \\033[?25lを非表示にしprintf \\033[?25hて再び表示するように動作を再現できます。他のエスケープシーケンス[H[2Jターミナルのクリア(比較clear | xxd
pLumo

17

IMHOの最良の方法は、top「バッチ」モード(-bフラグ)を使用することです。これは、別のプログラムまたはファイルへのパイプなどの非インタラクティブな使用例で使用することを目的としています。

したがって、この

top -n1 -b | head

カーソルなしでシェルを離れることはありません。

カーソルが消えた理由は ...

以来、top対話型プログラムなどグラブ入力、スクロールコンテンツへ順に端末と、それは「台無し」であり、それは非表示にカーソルを。

終了するときは、呼び出される前にカーソルと表示ステータスを復元する必要があり、1つ以上の制御コードを端末自体に送信することで復元します。

コマンドをを介してパイプすることによりhead、この制御コードは通過しません(headデフォルトでは最初の10行だけが出力topされ、最終状態を復元するための両方と制御コードの出力は常に> 10行です)。

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

例えば、

top -n1 | head -n 100

システムにカーソルを置きます。


ご回答ありがとうございます。を使用-bすることは私のために行く方法です。
pLumo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.