4

ウィキペディアによると、「プロセス置換は、通常はファイルに出力される出力をキャプチャして、プロセスの入力にリダイレクトするためにも使用できます。」( http://en.wikipedia.org/wiki/Process_substitution )。

ということで、私なりの言い方をすれば、プロセス置換で、コマンドAの出力をコマンドBの入力として使えるということです。

したがって、これが真実であり、私がこれを行う場合:

echo "test" >(wc)

次に、次の結果が得られることを期待する必要があります。

1 1 5

上記のコマンドの私の理解は次のようになっているためです。

$echo "test" > tmp
$wc tmp
1 1 5 tmp

ただし、プロセス置換で tmp ファイルを作成しません。

しかし、代わりに次の出力が得られます。

test /dev/fd/63

これは明らかに、私のメンタル モデルが正しくないことを示しています。どこが間違っていますか?

<(コマンド)はわかりました。例えば

$diff <(head file1) <(head file2) 

完全に理にかなっています。>(コマンド)ではありません。

4

2 に答える 2

3

からProcess Substitution

プロセスリストは、入力または出力が FIFO または/dev/fd内のファイルに接続された状態で実行されます。このファイルの名前は、展開の結果として現在のコマンドに引数として渡されます。>(list) 形式が使用されている場合、ファイルへの書き込みによって list の入力が提供されます

はどうなりecho "test" >(wc)ますか?

と接続するためにファイル/dev/fd/63が開かれます。に接続された入力で開始されます。次に、このファイルの名前 ( ) が引数として現在のコマンド ( ) に渡され、 . これがあなたが見る理由ですecho testwcwc/dev/fd/63/dev/fd/63echo "test"echo "test" /dev/fd/63

test /dev/fd/63

出力として。wcは入力を待ちますが、 にecho書き込みを行わないため/dev/fd/63、カウントは になります0

これを機能させたい場合は、最後の引数を取り、最初のN-1引数を最後の引数にエコーするスクリプトを作成する必要があります。

#! /bin/bash
echo "${@:1:$(($# - 1))}" >${@: -1}

これを呼び出すと

bash script.sh test >(wc)

期待される出力が表示されます

1 1 5
于 2013-04-17T22:40:41.813 に答える
2

あなたのメンタル モデルは、1 つの重要な詳細を見逃しているという点で正しくありません。プロセスの置換はリダイレクトではありません。

「echo test > tmp」などのリダイレクトを実行すると、実行されるのは「echo test」であり、stdout (">" で表される) は「tmp」という名前のファイルに送られます。"echo test >(wc)" などの置換を実行すると、"wc" が実行され、">(wc)" がファイルの名前 (または魔法のデバイスの名前) に置き換えられます。読み取りまたは書き込みが可能です。

リンク先のウィキペディアのページから引用したように、「内部では、プロセス置換は名前付きパイプを作成し、コマンド ラインでその名前を置換することで機能します。」

上記の「diff」の例をよく見ると、同じように機能することがわかります。結局のところ、"diff" の引数はコマンド ラインのファイル名以外にあるのでしょうか?

于 2013-04-17T22:40:59.003 に答える