Linuxでwaitコマンドを使用する方法は?

Linuxでwaitコマンドを使用する方法は?
#!/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

また、wait300秒の待ち時間はありません。代わりにすぐにメッセージを受け取ります。私は$!スクリプトで直系の子を仮定しています$$。いいえ?

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

または、誰でも簡単にバックティックを取り除くことができます。

関連情報