`cat ls`を実行すると、 `cat`の動作がわかりません。

`cat ls`を実行すると、 `cat`の動作がわかりません。

bashこれは役に立たないコマンドであることを知っていますが、inまたはinを入力すると入力するように求められますが、zsh1行以降にのみ返されますが、?をクリックするまで別の行を入力できる理由を知りたいです。cat | lscat</dev/stdin tr -d 'e' | lsCtrl + 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はラインバッファリングされます。、標準出力に出力し、標準入力にリダイレクトされますlsls標準入力から全く読み取らないので、ファイルリストを標準出力に出力して終了します。lsパイプの-endが閉じているのでlscatstdout)、catパイプも終了します。

stdinから読み取られずにstdoutに出力されないすべてのプログラムで同じ動作が観察されることがあります。例えば:

cat | uname -a

メモ: </dev/stdin重複しています。標準入力を標準入力にリダイレクトします。

関連情報