便利な行をフィルタリングする良い方法を偶然見つけましたfind
。一番下にパイプを接続し、一番下にless
表示されたら、矢印キーを押して正しい行だけを残します。いいえ、シンボリックリンクエラーはありません。他にはありません。(END)
up
Permission denied
find / -name foo | less
しかし、なぜ?この動作の原因に対する答えが見つかりません。less
結果ではない行を魔法のようにフィルタリングしますか?
答え1
find
-print
「ジョブ」がない場合は、ファイル名全体を標準出力に出力する基本ジョブが適用されます。エラーは標準エラーに移動します。
パイプ演算子は標準出力のみをリダイレクトするため、「正しい」ファイル名のみが送信され、less
他のすべては端末である標準エラーとして送信されます。less
返品端末に書き込むと、最初は画面にファイル名とエラーが表示されますが、上にスクロールするとless
(または画面を更新する他の操作を呼び出すと)、更新less
によってエラーが上書きされます。less
入力は標準出力に表示されます。find
から出力全体を渡すには、less
標準エラーもリダイレクトする必要があります。
find / -name foo 2>&1 | less
エラーを完全に無視するには、エラーをビットバケットにリダイレクトしてください。
find / -name foo 2>/dev/null | less
答え2
それはそれ自体とは何の関係もありませんless
。標準出力(stdout
)と標準エラー(stderr
)という2つの出力ストリームしかありません。予想通り、エラーメッセージはに移動stderr
し、通常の出力はに移動しますstdout
。デフォルトでは、パイプラインはを捕捉してstdout
無視しますstderr
。 findのエラーはにstderr
送信されないため、エラーをフィルタリングしているless
ようです。less