less
プロセスをパイプしてから、プロセスの終わりをスクロールするコマンドを実行したいと思います。現在のパイプテキスト。つまり、コマンドが標準出力を閉じていない場合はShift + Gがブロックされるため、長期実行コマンドの場合は完了するまで終了は表示されません。
たとえば、
i=0; while true; i=$((i+1)); do echo $i; sleep 0.001; done | less
ページングを開始するときにShift + Gを押すと、less
下にスクロールせずに無期限にブロックされます。
心配しないでください。バッファー- バッファがあまりにも多くの遅延を引き起こさないように、出力が頻繁に発生します。代わりに、現在のバッファの終わりまでスクロールするときに停止しないようにします。今後バッファの終わりも見えないようにディスプレイを更新してください。)
答え1
私が処理する方法は、出力をファイルに書き込んでからファイルにページを付けることです。あなたの例を使用すると、次のようになります。
i=0; while true; i=$((i+1)); do echo $i; sleep 0.001; done >/tmp/somefile
less /tmp/somefile
欠点は、出力を生成するプロセスに応じて/tmp/somefile
任意に大きくできることです。
パイプを介して書き込み/読み取りの代わりにファイルを使用する理由は実用的です。ユーティリティless
は、パイプから読み取るのかファイルから読み取るかに応じて異なる応答を持ちます。ファイルを読むとき、ファイルの終わりを「知って」すぐに見つけることができます。後でファイルが大きくなると、別の検索end(G
)がエンドポイントを再決定し、その新しいポイントを再検索します。一方、パイプの端を見つけると、パイプが閉じるまでブロックされます。 (このブロック効果はパイプがバッファリングされているかバッファリングされていないかにかかわらず適用されます。)ブロックさless
れたら応答するだけでCtrl C、表示したい出力を生成したプロセスにも影響します。残念ながら、これはしばしば悪影響をもたらします。
答え2
このオプションが新しいのかどうかはわかりませんが、ESC-G
問題に対する正確な解決策のようです。マニュアルによると:
ESC-G Same as G, except if no number N is specified and the input is standard input, goes to the last line which is currently buffered.
しかし、残念ながらCLIからlessに渡す方法が見つかりませんでした。