バックグラウンドで起動した同じPIDの終了を待ち、その終了ステータス7を現在のBashで取得する。
単に一定時間待つのではなく、対象プロセスの完了と終了状態を扱う。
bash -c 'sleep 1; exit 7' &
TASK_PID=$!続けて実行するコマンドとして適切なものはどれか。
waitにPIDを指定すると、その非同期プロセスの完了を待ち、終了ステータスを返す。直後の$?でその値を参照できる。
詳細解説
jobs -l; printf '%s\n' "$?"jobsはジョブを一覧表示するが、対象の完了を待ってその終了状態を返す操作ではない。
誤りです。jobs -lは現在のシェルが管理するジョブとPIDを表示します。
直後の$?はjobsコマンド自身の成否であり、バックグラウンド処理のexit 7ではありません。
sleep 1; printf '%s\n' "$?"表示するのはsleep自身の終了ステータスであり、バックグラウンド処理の7ではない。
誤りです。sleep 1は指定時間だけ自分自身を停止します。
直後の$?はsleepの終了ステータス0であり、別プロセスの完了や値を受け取りません。
kill -0 "$TASK_PID"; printf '%s\n' "$?"kill -0はシグナルを送れるか確認するもので、対象の終了ステータスを取得しない。
誤りです。kill -0は対象プロセスの存在や権限確認に使えます。
プロセスが終了するまで待つ操作ではなく、終了した子のステータス7も取得しません。
wait "$TASK_PID"; printf '%s\n' "$?"waitが指定PIDの終了まで待ち、その終了ステータスを現在のBashへ返す。
正しい選択肢です。waitはTASK_PIDの終了まで現在のBashを待機させます。
wait自身の終了ステータスが対象子プロセスの7になるため、直後の$?で取得できます。
実際に確かめる
一時的な検証環境で実行できる例です。
bash -c 'sleep 1; exit 7' &
TASK_PID=$!
wait "$TASK_PID"
TASK_STATUS=$?
printf 'status=%s
' "$TASK_STATUS"期待される結果
status=7理解のポイント
- $!は直前のバックグラウンドPID
- waitは指定PIDの完了を待つ
- $?は直前コマンドの終了ステータス
確認時の注意
- 確認環境: Bash 5.2
- 終了ステータス7は失敗を表すため、set -eが有効なシェルでは途中終了に注意します。
- 対象は現在のBashが起動した子プロセスです。
基礎のおさらい
バックグラウンド起動
コマンド末尾の&は完了を待たずプロンプトを返します。直後の$!でそのPIDを保存できます。
waitの戻り値
wait PIDは指定した子の終了ステータスを返します。複数の非同期処理では、どのPIDを待つか明示します。
$?の寿命
$?は次のコマンドを実行すると上書きされます。必要な値はwait直後に別の変数へ保存します。