falseを実行した後にecho DONEを実行する。
falseの失敗にかかわらずDONEを表示する。
通常設定の新規Bashで、errexit(set -e)は無効とする。前の処理の完了を待ってから次を実行する。
適切なコマンド列はどれか。
セミコロンで区切ったコマンドは順番に実行され、前のコマンドの成功を次の実行条件にしない。
詳細解説
false && echo DONEfalseが失敗するため&&の右側は実行されない。
falseは1を返すため&&の右側を実行しない。失敗後にも表示するという要件を満たさない。
true || echo DONEtrueが成功するため||の右側は実行されない。
trueは0を返すため||の右側を実行しない。加えて、実行対象をfalseからtrueへ変えている。
false; echo DONE;は左側の終了状態にかかわらず次のコマンドへ進む。
設問のerrexit無効のBashでは、falseの完了後にechoを実行する。echoが成功したリストの終了状態は0になり得るが、false自身の1とは区別する。
false | echo DONEDONEは表示されるが、要件の逐次実行ではなくパイプラインを作る。
この例でもDONEは出るため、表示だけでは正解との違いを確認できない。パイプの後段は前段の完了を待ってから始める関係ではなく、要件の逐次実行を表さない。
実際に確かめる
一時的な検証環境で実行できる例です。
false; echo DONE
printf 'list status=%s\n' "$?"
(
set -e
false
printf 'not reached\n'
)
printf 'errexit status=%s\n' "$?"参考にした公式資料
期待される結果
DONE
list status=0
errexit status=1理解のポイント
- セミコロン
- 逐次実行
- 短絡評価との違い
確認時の注意
- 確認環境: Bash 5.2の新規プロセス。設問と最初の例はerrexit無効。後半だけ子シェルでset -eを有効にし、前提外の終了を比較する。
- 検証の最初は設問の通常設定で実行する。後半のset -eは子シェルだけに限定した前提外の比較であり、普段の作業シェルの設定を変更しない。
- errexitにはif条件、&&/||リスト、パイプラインなどによる例外がある。この子シェルは条件式として呼ばず、単独コマンドfalseで終了する例に限定する。
基礎のおさらい
出力が同じでも実行関係は違う
false; echo DONEとfalse | echo DONEはいずれもDONEを表示する。どの文字が出るかだけでなく、前の処理の完了を待って次へ進むかを読む。
セミコロンとシェル設定を分ける
;は終了状態による分岐を表さないが、set -eなどでシェル自体が終了すれば次へ到達しない。今回の設問はerrexit無効の通常設定を明示する。
終了状態を後から取り違えない
false; echo DONEの直後の$?はechoの状態を表す。falseの状態を調べたいなら、次のコマンドが置き換える前に保存する。