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
。