最初のデータがパイプに書き込まれます(一貫性があるかどうか)。

最初のデータがパイプに書き込まれます(一貫性があるかどうか)。

このパイプラインがある場合:

echo "bar" | nc localhost 6969 < <(echo "foo")

「foo」は常にTCPソケットの「bar」の前に書き込まれますか?一貫した優先順位はありますか?

ベストアンサー1

存在する

cmd1 | cmd2

cmd1そして、パイプの書き込み端(またはksh93のソケットペア)に接続されているstdoutと、パイプのもう一方の端に接続されたstdinと並列cmd2に始まります。cmd1cmd2

存在する:

cmd < file

cmdcmdで開かれたstdinから始まりますfile

だからあなたは見ることができます

cmd1 | cmd2 < file

衝突; cmd2stdinがパイプから来ていないcmd1かどうかfile

上記の場合、ほとんどのシェルでは、<fileリダイレクトが完了した後に優先順位が与えられます。後ろに(シェルはパイプ間の2つのプロセスを開始し、それから各コマンド内の独立したリダイレクトを含む各コマンドが説明されています。

これはcmd2、標準入力がありfile、書き込まれるパイプにリーダーがechoない(壊れたパイプ)を意味します。したがって、あなたの場合は決して成功しなくなり、bar他のプロセスがファイルを開いた後に書くと、実行nc中のプロセスがecho bar終了する可能性があります。bar

zshただし、そのオプションがオンの場合multios(デフォルトではオン)、zsh同じファイル記述子(ここでは0、stdin)を2回リダイレクトしようとしていることが検出され、送信された2つのソースからデータをリダイレクトしたいとしますcmd2。だから標準入力cmd2に送るのではなく、実際に内部パイプを起動します。cmd1fileフィーダー両方のソースからデータを読み取り、それを別のパイプを介して順番に転送するプロセスですcmd2

cmd1 < <(cmd2)

これは、名前付きパイプ(または名前付きパイプのように動作するもの)がもうcmd1 < file一方の端で書かれている場合の1つにすぎませんが、それ以外はあまり変わりません。filecmd2

移植可能な2つのコマンドの出力、または1つのコマンドの出力とファイルの内容をコマンドに送信するには、次のようにします。

{
  cmd1
  cmd2
} | cmd3

または:

{
  cmd1
  cat < file
} | cmd2

だからここにあります:

{
  echo bar
  echo foo
} | nc localhost 6969

おすすめ記事