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
。