7

わかりました、明らかに私は bash の第一人者ではなく、それが必要です!

これまで「coproc」を使用したことはありませんが、まさに必要なもののようです。しかし、さまざまな「ping」の例から推定できないことを認めなければなりません。[私は数時間試しました...]

私がやりたいことは、標準入力から入力を受け取り、その結果を標準出力に書き込むことができる「coproc」シェルスクリプトを開始することだけです。これらのコマンドと結果の送信と処理をそれぞれメイン スクリプトで実行する必要があります。

これが私がやろうとしていることの最も簡単な概要の1つです :

#! /bin/bash

coproc bkgndProc {
    /some/path/to/usefulScript.sh  maybeSomeArgsHere
}

// send command #1 to bkgndProc here
result=$(echo 'command' <&${bkgndProc[0]})    ### Doesn't work for me
echo "Did it work? $result"   ### this just prints back the 'command' I used

// here execute conditional logic based on result:
// if result1; then
//     send command #2 here, getting results
// else
//     send command #3 here, again getting results
// fi

上記の疑似コードを使用して申し訳ありませんが、これらの送信コマンドがどうあるべきかわかりません! 誰かが詳細を提供できれば、大歓迎です!

4

1 に答える 1

8
result = $(echo 'command' <&${bkgndProc[0]})    ### Doesn't work for me

スペースがあるため、少なくとも基本的には機能しません

result=$(echo 'command' <&${bkgndProc[0]})

- - アップデート - -

次のようなスクリプトで簡単な概念を示すことができます。

#!/bin/bash

# create the co-process
coproc myproc {
    bash
}

# send a command to it (echo a)
echo 'echo a' >&"${myproc[1]}"

# read a line from its output
read line <&"${myproc[0]}"

# show the line
echo "$line"

出力:

a

タイムアウトを使用して複数の行を読み取る別の:

#!/bin/bash

coproc myproc {
    bash
}

# send a command to message 4 random numbers in 4 lines
echo 'echo "$RANDOM"; echo "$RANDOM"; echo "$RANDOM"; echo "$RANDOM"' >&"${myproc[1]}"

# keep reading the line until it times out
while read -t 1 -u "${myproc[0]}" line; do
    echo "$line"
done

出力:

17393
1423
8368
1782

を使用するcatと、もう一方の端がまだ生きていて接続されており、EOF にまだ達していないため、終了しません。これが、タイムアウトを使用した理由です。

cat <&"${myproc[0]}"
于 2013-09-10T18:41:32.070 に答える