パイプラインの他のプロセスを停止せずに「less」フォローモードを終了する方法はありますか?

パイプラインの他のプロセスを停止せずに「less」フォローモードを終了する方法はありますか?

何度も私はすべての機能(スクロール、検索、ショートカット...)を含むバッファに出力を保存する必要があることに気づき、慣れましたless

しかし、私が使用するほとんどのコマンドは、常に出力を生成します。連続出力を使用すると、less実際に期待どおりに機能しません。

たとえば、

while sleep 0.5
do
    echo "$(cat /dev/urandom | tr -cd 'a-zA-Z0-9' | head -c 100)"
done | less -R

これにより、less出力が最大ターミナルの高さに達するまでキャプチャされ、この時点ですべてが停止し(まだデータを受け入れることができるように)、移動キーを使用して上下にスクロールできます。これが望む効果です。

奇妙なことは、生成されたコンテンツ(通常は使用)に追いつくとロックがPgDn発生し、新しいデータを追跡して元のコマンドを終了して停止するまで移動キーを使用できないことです。これは望ましい効果ではありません。less^C

less私が間違って使っているのではないでしょうか?私の願いを聞くことができる他のプログラムはありますか?このモードでは「ロック解除」は可能ですか?

ありがとうございます!

答え1

^Cを使わずに「less」フォローモードを終了する方法はありますか?

はい、スタートバージョン569以降、CTRL+を使用してフォローモードを終了できます。Xこれはパイプラインの他のプロセスを停止しません。

以前のバージョンのless(+のみサポート)では、+を押したときに送信されたSIGINT信号がパイプ内の他のプロセスに影響を与えずに実行を継続するようにCTRL配置することが可能でした。Cこれは、次のいずれかを実行することで達成できます。CTRLC

  • これらを使用してこれらのプロセスを別のプロセスグループに移動して、SIGINTがパイプラインの他のプロセスに到達するのを防ぎます。設定値便利:

(setsid seq 10000000) | less +F

  • 扱う(捕獲)パイプの他のプロセスに渡されないようにSIGINT:

(trap '' INT; seq 10000000) | less +F

  • プロセス置換を使用してください(Bash、Zsh、Kshでは実装されているがDashなどでは実装されていない非POSIX機能)。

less -f +F <(seq 10000000)

(seq 10000000 &) | less +F

プロセスグループと信号処理に対する上記コマンドの効果を観察するには、ps -O ppid,pgrp,sid,ignored --forest -C bash,less,seq別の端末でコマンドを使用することをお勧めします。

答え2

追加したいファイルを見るとうまくいきますが、入力がパイプから出てくるとそうではありません(F-control-Cコマンドを使用するとうまくいきます)。

ディスカッションを見るパイプラインに従い、より少なく使用しますか?- これは既知のバグ/デメリットですless

答え3

( your_input_pipeline & ) | less +F

そして

{ your_input_pipeline & } | less +F

Bashで動作しているようです。less終了後にINT信号が囲まれたシェルに伝播することを除いて、ZshとDashでも機能します。 Kshでは動作しません。

テスト構成:

GNU bash 5.0.17
dash 0.5.10.2-6 (package version in Ubuntu Linux)
zsh 5.8
less 551

答え4

おそらく最も簡単な答えは次のとおりです。

trap '' INT
your_input_pipeline | less +F
# you may want to restore or define new INT trap here
echo still in the shell

これはまた、囲むシェルが中断されるのを防止する。これは、シェルが Bash でない場合、他の回答で発生する可能性があります。

関連情報