web-dev-qa-db-ja.com

パイプ内の他のプロセスを停止せずに「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は最大端子高さに達するまで出力をキャプチャし、この時点ですべてが停止し(できればデータを受け入れます)、移動キーを使用して上下にスクロールできるようになります。これが望ましい効果です。

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

lessを間違って使用していますか?私が望むことをする他のプログラムはありますか?このモードから「ロック解除」することは可能ですか?

ありがとうございました!

6
normalra

追加されているファイルを見るときは問題なく機能しますが、入力がパイプからのものであるときは機能しません(Fコマンドを使用します-control-Cは正常に機能します)。

lessを使用してパイプをたどる? の説明を参照してください-これはlessの既知のバグ/欠点です。

6
Paul Haldane

^ Cなしで「less」フォローモードを終了する方法はありますか?

いいえ、ただし、次のように配置できます。 CTRL-C パイプ内の他のプロセスに影響を与えないため、それらを実行できます。

ソリューションA–シェルの モニターモード を使用して、独自のプロセスグループへの移動を減らします(set -m

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

アイデアはPSkocikから来て、彼の answer で与えられました。

ソリューションB– SIGINTの処理(CTRL-C)パイプ内の他のプロセスに配信されないようにする

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

#bash IRCチャネルでgeirhaによって与えられた解。

2
Piotr Dobrogost