区切り記号と手続き型置換の違いは何ですか?

区切り記号と手続き型置換の違いは何ですか?

この回答では、インタラクティブプログラムの標準入力を区切り文字に関連付けて、区切り文字を使用してインタラクティブプログラムと対話する方法について説明します。

https://stackoverflow.com/questions/21130757/send-commands-to-socket-using-netcat

「あファイル!」と思ったので、プロセス交換が使えます!

だから私は次のことを試しました。

nc -lvkp 8000 <(echo "test")

その後、エラーが発生しました。

Ncat: Could not resolve hostname "/dev/fd/63

それではファイルですね!しかし、netcatはそれを理解していません(私が書いた一般的なファイルではそれを理解しています/tmp/commands.txt)。 netcatがそれを理解していない場合、私は本当に気にしません。

私が本当に心に留めておくのは、私が正しく理解したなら、heredocも一時ファイルだと思うということです。しかし、明らかにnetcatはこれを理解しています。したがって、これと区切り記号/dev/fd/63の間に違いがなければなりません。

では、違いは何ですか?

私はその一部が/dev/fd/63永久的ではないか、部分dev/fd的に異なると思います。そこで、区切り記号がそこではなく他の場所に保存されていると思いました。

編集:はecho "test"「印刷単語テスト」を意味します。

答え1

ここの文書は標準リダイレクト、プロセス置換は標準ではありませんが(したがって、すべてのシェルがそれをサポートしているわけではありません)、リダイレクトではありません。

明示的なプロセスの置き換え注文の実行特定のパス名から読み取ることができ、ここに文書化された出力を生成します。テキストファイルの作成すぐにリダイレクトしてください。ここのドキュメント可能これは一時ファイルに書き込むことで行うことができますが、名前付きパイプや同様のエントリに書き込むことでもできます。

呼び出しは、ncプロセス置換結果を標準入力ストリームに渡すのではなく、ncコマンドラインのファイル名として渡します。echoプロセス置換を使用して標準入力の出力を渡すには、次のようにします。

nc -lvkp 8000 < <( echo "test" )

<最初のパスがプロセスオーバーライドによって生成されたパス名からどのようにリダイレクトされるかを確認してください。

この文書を使用して作成します。

nc -lvkp 8000 <<'END'
test
END

ここでは、特定のパス名を参照せずにリダイレクトを実行する方法に注意してください。また、echoリダイレクトされた文書のテキストを生成するためにそのコマンドを使用しない方法にも注意してください。

答え2

ここにあるドキュメントはリダイレクトです。シェルはテキストをどこかに保存し、コマンド入力にリダイレクトします。 (正確なメカニズムではないかもしれませんが、システムを考えるのに十分です。)

プロセス置換は、コマンドの入力または出力へのパスを提供します。~へプロセスの置き換え。ただし、そのコマンド以外の他のエントリには独自のリダイレクトは適用されません。リダイレクト記号(>in>(...)または<in <(...))のために異なる考えがある場合は、内部のすべてに適用されると考えてください。> プロセス置換を指すことは、次に適用されます。入力する内部コマンドは、<出力にも同様に適用されることを示します。彼らは何も影響しません外部

したがって:

nc 192.168.1.186 9760 <<END
command1
command2
END

nc入力はリダイレクトされますが、

nc -lvkp 8000 <(echo "test")

nc入力はいいえリダイレクト。 (echoただし、 の出力はプロセス置換から読み取った内容にパイプされます。) 追加nc引数を取得します。

リダイレクトを直接適用する必要があります。

nc -lvkp 8000 < <(echo "test")

答え3

これは違いを強調します。 wc はどちらの場合も同じデータを表示します。まず、コマンドラインから引数(一時ファイル名)を取得します。 2番目の例では、ファイル名はシェルリダイレクトによって使用され、wcは引数を取得せず、デフォルトでstdinを読み取ります。

Paul--) wc <( echo one two three )
      1       3      14 /dev/fd/63
Paul--) wc < <( echo one two three )
      1       3      14
Paul--) 

答え4

私はいくつかの良い答えを読んでいますが、私が書いたい答えほど単純ではありません。したがって、次のようになります。

  • ここの文書は<<標準にリンクされています。
  • 置換を処理するには、<(...)「file」に接続してファイル名を変更します。

注: ファイルと言えば Unix 方式で使うことです。必ずしもディスクにファイルがあるわけではありません。これは、名前付きパイプ、匿名パイプ、net-socket、unix-socketなどのディレクトリにすることができます。この場合(匿名化されていません:そのプロセスにのみ表示されるファイル名があります)、接続先)は匿名パイプになります。 。

関連情報