gunzip < 100terabytes.txt.gz | less
less(1)
画面を埋めるのに必要な数の行を読み、停止しますread(2)
。その結果、配管がいっぱいになるとgunzip(1)
詰まります。write(2)
下にスクロールすると、less(1)
質問が引き続きエクスポートされ、read(2)
パイプが消費されるとgunzip(1)
許可されますwrite(2)
。ここで前後に移動できる完全な柔軟性があります(gunzip < 100terabytes.txt.gz
まだ完了していないと仮定)。
今まではそんなに良くなった。
less(1)
テキスト検索の開始を使用できます/
。ただし、検索文字列が で見つからないと、100terabytes.txt
デフォルトless(1)
では応答しなくなります。検索出口を使用できますCtrl-C
。しかし、gunzip(1)
との間のパイプを閉じたようですless(1)
。私はこれが嫌いです。gunzip(1)
テキスト検索を放棄したら、手動で下にスクロールしてより多くの行を使用したいと思います。可能ですか?
はいいいえアドバイスを求めてください。gunzip < 100terabytes.txt.gz | grep pattern | less
修正する
試してみることができますod -v /dev/zero | less
答え1
を押すとCtrl+Cフルシェルになります。働く(プロセスグループ)SIGINTを受け取り、less
それを傍受して検索を中断しますがgunzip
終了します。これを防ぐには、次のようにします。
(trap '' INT; gunzip < file.gz) | less
これはSIGINTを無視しますが、gunzip
それ以降は中断できません。gunzip
については大丈夫かもgunzip
しれません。終了するだけでは、次回何かを書くときにSIGPIPEと一緒に死ぬからです。ただし、何かを出力せずに停止するアプリケーションの場合、これはより大きな質問になります(まだ可能です。SIGTSTPまたはSIGQUITを使用しているless
場合)。gunzip
Ctrl+ZCtrl+\
また、独自のSIGINTハンドラをインストールpv
またはインストールするなどの一部のコマンドは。ping
trap '' INT
入力を保存する関数を作成できます。たとえば、次のようになります。
iless() {
(trap '' INT; "$@") | less
}
iless gunzip < file.gz
または:
noint() (trap '' INT; "$@")
noint gunzip < file.gz | less
ただし、次の点に注意してください。
gunzip < file.gz | grep foo | less
あなたはそれを書く必要があります:
noint gunzip < file.gz | notint grep foo | less
または:
noint eval 'gunzip < file.gz | grep foo' | less
または:
iless eval 'gunzip < file.gz | grep foo'
別の方法は、プロセス置換を使用することです。
less -f <(gunzip < file.gz | grep foo)
または(にはありませんがzsh
):
less < <(gunzip < file.gz | grep foo)
この場合、シェルにはフォアグラウンドプロセスグループのプロセス置換コマンドは含まれません(forの2番目の場合を除くzsh
)。そのプロセスグループはシェルのプロセスグループと同じです。これは、を押すとSIGINTを受信しないことを意味しますCtrl+C。
これらのプロセスは、Ctrl+Zまたはの影響を受けませんCtrl+\。
zsh
、およびでksh93
テストされましたbash
。
答え2
正確な答えではありませんが、問題を解決できます。からman less
:
ESC-F Like F, but as soon as a line is found which matches the last
search pattern, the terminal bell is rung and forward scrolling
stops.
これは中断される可能性がありますが、^C
問題を再現できないため、パイプが破損しているかどうかはわかりません(これをテストするには非常に大きな入力ファイルが必要になるようです)。通常、ファイルが増えている場合、この操作を繰り返し実行できますが、まだ機能しているため、パイプラインが破損していないと思いますF
(まだファイルが増えていることがわかります)。^C
F
問題は、less
パターンが見つからない場合は停止せずに「最後に検索したパターン」を入力する方法です。おそらく、^K
次のオプションが/
役に立ちます。
^K Highlight any text which matches the pattern on the cur-
rent screen, but don't move to the first match (KEEP cur-
rent position).
編集:またはもっと簡単に言えば、?
この「最後の検索モード」を「設定」することです。