web-dev-qa-db-ja.com

lsをgrepにパイプします(行と「アイテム」)

次のコマンドについて考えてみます。

ls
dir1 dir2 file1
x1   x2   y2

この出力がたとえばにパイプされるときgrepの各ファイル/ディレクトリは「アイテム」として処理されます。

ls | grep f
file1

したがって、明らかに、lsが生成する実際の出力とgrepによって処理される入力には違いがあります。

Grepは行で動作するため、ls | grep fは、最初の行全体を表示します。つまり、dir1 dir2 file1

ここで何が欠けていますか?この動作の背後にあるメカニズムは何ですか?

2
Anton Harald

コマンドは、その出力がTTYに送られるかどうかを検出することができます。したがって、この特定のケースでは、lsがその出力がTTYに送信されないことを検出すると、-1が引数として渡されたかのように動作します。

これを見ると、grepcatを使用して特別なことを何もしていないことがわかります。

ls | cat
4
Patrick

出力がリダイレクトされているときにlsがどのように動作するかを確認するには、実行してみてください

ls | cat

または

ls -1

これは、出力がTTYに送信されない場合のlsの動作です。

1
choroba