#!/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
。
答え2
バックティックを取り除きます。
これでwait
、親シェルの操作にアクセスできないサブシェルで実行されているため、すぐに失敗します。
$?
終了状態が必要な場合は、待機後すぐに値を取得します。
command_here &
wait
status=$?
答え3
バックティックを削除すると、プログラムは正しく実行されますが、すでに確認されている理由ではありません。実際、wait
親プロセスにアクセスできないサブシェルで実行されるため、すぐに失敗しますが、有効なコマンドを使用してもプログラムは期待どおりに実行されません。
このif
ステートメントはプログラムを実行し、終了ステータスがゼロかゼロでないかを確認します。バックティックを使用すると、if文は次のことを行います。出力プロセスをプログラムとして実行し、そのプロセスの終了コードを試してください。したがって、プログラムはwait
失敗したため失敗するのではなく、wait
出力を生成しないので失敗します。
echo
バックティック内部を使用して、スクリプトが機能するようにすることができます。
if `echo wait $!`; then
echo success
else
echo failure
fi
または、誰でも簡単にバックティックを取り除くことができます。