bash
これは役に立たないコマンドであることを知っていますが、inまたはinを入力すると入力するように求められますが、zsh
1行以降にのみ返されますが、?をクリックするまで別の行を入力できる理由を知りたいです。cat | ls
cat
</dev/stdin tr -d 'e' | ls
Ctrl + D
答え1
1秒後に何も印刷するのと同じ理由です。
(echo abc; sleep 1; echo def) | tr -d e |cat
そして標準出力パイプにリダイレクトし、最大ユーティリティは出力バッファリングを開始し、完全なデータブロックが取得された後にのみ出力を記録します。 (ブロックのサイズは実装の詳細であり、数キロバイトです。)バッファリングを無効にするために使用できるユーティリティがあります。以下を参照してください。パイプラインでバッファリングをオフにする。
ただし、一部の実装では、cat
バッファリングを実行せずにすぐに作成します。これには少なくともGNUとBusyboxの実装が含まれます。cat
バッファリングの一般的な効果は次のとおりです。POSIX が指定されていません。、のみcat -u
、防ぐバッファー。
ここ、それ以来ls
何も読んでいない標準入力したがって、パイプラインは、ユーザーが入力するよりも早く完了して終了することができます。したがって、cat
/何でも書き込みを開始すると、tr
パイプはすでに閉じられており、作成者はSIGPIPEを受け取り、終了します。読み取った内容はバッファリングなしですぐにここに書き込まれるので、cat
最初の入力ラインの直後に信号を受け取ります。一方、tr
何も書き込みのためにバッファ全体を取得するのを待つので、最初の入力ラインではトリガされません。十分なデータを入力すると、tr
最終的にパイプに書き込まれ、信号を受信して終了します。
あなたが言ったように、パイピングはls
何も読んでいないので愚かです。代わりに、true
または同じものを使用できますfalse
。
答え2
cat
パラメータがない場合は、stdinから読み込み、入力の最初の行を待ちます。対話型デバイスを参照すると、stdinはラインバッファリングされます。、標準出力に出力し、標準入力にリダイレクトされますls
。ls
標準入力から全く読み取らないので、ファイルリストを標準出力に出力して終了します。ls
パイプの-endが閉じているのでls
(cat
stdout)、cat
パイプも終了します。
stdinから読み取られずにstdoutに出力されないすべてのプログラムで同じ動作が観察されることがあります。例えば:
cat | uname -a
メモ: </dev/stdin
重複しています。標準入力を標準入力にリダイレクトします。