2

変数のいくつかのコマンド出力に依存する長いメニュー スクリプトがあります。これらのコマンドはそれぞれ実行に数秒かかるため、これらの変数を設定する新しいプロセスを生成したいと考えています。次のようになります。

VAR1=`somecommand` &
VAR2=`somecommand` &
...
wait
echo $VAR1 $VAR2

問題は、プロセスが生成され、設定された変数で終了することです。これらをファイルに送信してから読み取ることでこれを実行できることを認識していますが、一時ファイルなしで実行したいと考えています。何か案は?

4

2 に答える 2

0

これはかなり不格好ですが、私にとってはうまくいきます。私は3つのスクリプトを持っています。

cmd.sh は「somecommand」です。これはテスト スクリプトのみです。

#!/bin/ksh
sleep 10
echo "End of job $1"

以下はwrapper.sh、単一のコマンドを実行し、出力をキャプチャし、完了したら親に通知し、結果を stdout に書き込みます。

#!/bin/ksh
sig=$1
shift
var=$($@)
kill -$sig $PPID
echo $var

親スクリプトは次のとおりです。

#!/bin/ksh

trap "read -u3 out1" SIGUSR1
trap "read -p out2" SIGUSR2

./wrapper.sh SIGUSR1 ./cmd.sh one |&
exec 3<&p
exec 4>&p

./wrapper.sh SIGUSR2 ./cmd.sh two |&
wait
wait
echo "out1: $out1, out2: $out2"
echo "Ended"

最初のものが中断されるため、2x 待ちます。

親スクリプトでは、実行するコマンドと引数を渡して、ジョブごとに 1 回ずつ、2 回ラッパーを実行しています。「バックグラウンドへのパイプ」という|&意味 - コプロセスとして実行されます。

2 つのexecコマンドは、パイプ ファイル記述子を fds 3 および 4 にコピーします。ジョブが終了すると、ラッパーはメイン プロセスにパイプを読み取るように通知します。trapシグナルは、適切な子プロセスのパイプを読み取り、結果のデータを収集する を使用してキャッチされます。

かなり複雑で不格好ですが、うまくいくようです。

于 2012-11-09T17:30:19.497 に答える
0

次のようなコマンド置換を使用して、プロセス全体の出力を取得できます。

VAR1=$(somecommand &)
VAR2=$(somecommand &)
...
wait
echo $VAR1 $VAR2
于 2012-11-09T15:04:26.227 に答える