1.06.2基礎
check_dataを実行した直後、その終了状態を変数statusへ保存する。
保存前に別コマンドは実行しない。
適切な記述はどれか。
× 不正解
$?は直前に完了したパイプラインの終了状態である。参照前に別コマンドを実行すると値が上書きされる。
詳細解説
誤り
status=$#位置引数の個数を保存する。
$#はスクリプトや関数に渡された位置引数の数である。check_dataの成功や失敗では変化しない。
誤り
status=$$現在のシェルのPIDを保存する。
$$はシェルのPIDを表す。終了状態ではないため、通常は0より大きいプロセス識別番号になる。
誤り
status=$!直前にバックグラウンド起動したプロセスのPIDを保存する。
$!は直前に&で起動したバックグラウンド処理のPIDである。同期実行したcheck_dataの終了状態ではない。
正しい
status=$?直前のパイプラインまたはコマンドの終了状態を保存する。
$?は直前のcheck_dataが返した終了状態を保持する。代入自体の前に参照することで別コマンドによる上書きを避けられる。
実際に確かめる
一時的な検証環境で実行できる例です。
sh -c 'false; status=$?; printf "%s\n" "$status"'期待される結果
1理解のポイント
- $?は終了状態
- 直後に保存
- 0成功・非0失敗
確認時の注意
- 確認環境: POSIX sh / 状態変更なし
- パイプラインの終了状態はpipefail設定の有無などで意味が変わる場合がある。
基礎のおさらい
直後に保存
$?は次に別コマンドを実行するとその結果へ更新される。必要ならstatus=$?を直後に置く。
0と非0
慣例として0が成功、非0が失敗を示す。非0値の詳細な意味はコマンドごとに異なる。
問題IDKL-102-924
確認環境POSIX sh / 状態変更なし
最終技術確認2026-08-13
誤り・権利侵害を報告