#!/bin/bash
function back()
{
sleep $1
exit $2
}
back $1 $2 &
b=$!
if `wait $!`;then
echo success
else
echo failure
fi
bash-3.00# ./back 300 0
failure
bash-3.00# ./back 300 1
failure
0を送信するとsuccess
終了ステータスが予想されますが、それでも受信されますfailure
。
また、wait
300秒の待ち時間はありません。代わりにすぐにメッセージを受け取ります。私は$!
スクリプトで直系の子を仮定しています$$
。いいえ?
waitなどの終了ステータスをキャプチャできますかexit_status=$(wait $!)
?
if ! ((exit_status));then
echo sucess
else
failure
fi
ベストアンサー1
wait
問題は、サブシェルで次を実行することです。
if `wait $!`;then
wait
命令ではなく組み込み命令なのでサブシェル、現在シェルではありません。
表示されますが表示されない出力は次のとおりです。
wait: pid 12344 is not a child of this shell
...戻り状態は1です。
テストを実行するには、サブシェルを使用せずにテストする必要があります。
#!/bin/bash
function back()
{
sleep $1
exit $2
}
back $1 $2 &
b=$!
wait $b && echo success || echo failure
これは予想される結果を提供し、予想された時間を待ちます。
$ time ./test.sh 3 0
success
./test.sh 3 0 0.00s user 0.01s system 0% cpu 3.012 total
$ time ./test.sh 3 1
failure
./test.sh 3 1 0.00s user 0.01s system 0% cpu 3.012 total
以下を使用してコマンドの終了ステータスを確認できます$?
。
$ /bin/true
$ echo $?
0
$ /bin/false
$ echo $?
1
スクリプトに異なるエラーがあります。行#!
形式が正しくありません。修正しました。$!
に割り当てたが$b
使用しないでください$b
。