次のスクリプトを考えてみましょう。
$ cat example.sh
#! /usr/bin/env bash
for i in {1..90}
do
printf '%s\n' "$i"
done
sleep 10
printf '91\n'
sleep 10
printf 'done\n'
出力が次のようにパイプラインが少ないと仮定します。
$ bash example.sh | less
90行まで下にスクロールすると、もう一度上にスクロールして検索し、提供されているless
他の対話型コマンドを使用できます。ただし、egj
またはline 90を使用しようとすると、Ctrl-N
他の
less
入力行が利用可能になるまで対話型コマンドへの応答が停止します。スペースバーを使用して90行を超えてページ全体をスクロールしようとすると、ページ全体の入力が可能に
less
なるかEOFが受信されるまで、対話型コマンドへの応答が停止します。
以前の出力を見たい、利用可能な行を探索していて、より多くの行が表示されるのを待つ必要があることを認識していない場合(任意の時間がかかる場合があります)、これはお勧めできません。
Ctrl-C を使用して SIGINT を送信すると、すぐにやり直すことができますが、less
パイプからより多くの入力を受け取ることは停止します。
このスクリプトは再現しやすい例ですが、壊れたシンボリックリンクの検索など、出力行をゆっくり生成する長期実行コマンドに置き換えることができます。
$ find $HOME -xtype l | less
または私のホームディレクトリで誰でも読むことができます:
$ find $HOME -perm 777 | less
またはstdout
。
less
パイプで必要な入力行が生成されるのを待たずに、より多くの入力を待たずにインタラクティブコマンドに戻るようにする方法はありますか?
ベストアンサー1
存在する
bash example.sh | less
パイプ全体が前景に配置されます(前景プロセスグループには、実行中のプロセスbash
と生成されたすべてのプロセスの両方が含まれています)。したがって、+をless
押すとすべてSIGINTを受け取ります。CtrlCbash
sleep
less
sleep
受ければ死ぬのだから死ぬのだbash
。less
SIGINTを傍受し、次のように処理します。現在のジョブをキャンセル。
しかしbash
、死なないと、読み続けることができますless
。
したがって、あなたができることは、bash
SIGINTが死を招くのを防ぐことです。
(trap '' INT; bash example.sh) | less
Ctrlその後、+を使用してスクリプトによって開始されたプロセスに影響を与えることなくC中断できます。less
bash
スクリプトを停止するには、SIGTERMを使用してCtrlSIGQUITを\送信CtrlできZますkill %
。
ここで 1 は SIGINT のため終了します。 SIGINTが正常に処理され終了するbash
と、sleep
状況は異なります。これはsleep
他のシェルで実行される特別なSIGINT処理です。bash