test -f app.confで、app.confが通常ファイルとして存在するかを確認する。
確認に成功した場合だけecho READYを実行する。
適切なコマンド列はどれか。
ANDリストの&&は、直前のコマンドが成功したときだけ次へ進む。成功は終了状態0で表される。
詳細解説
test -f app.conf && echo READY&&は左側の終了状態が0の場合だけ右側を実行する。
通常ファイルがあるときはtestが0を返し、続く表示が実行される。存在しない場合やディレクトリの場合は右側を実行しない。両方の状態を比べると、条件付きの実行だと確認できる。
test -f app.conf || echo READY||は左側が失敗した場合に右側を実行する。
||は左が非0の場合に右へ進むため、通常ファイルがないときにREADYを表示する。この問題の成功時という条件とは逆になる。
test -f app.conf; echo READY;は成否にかかわらず右側を実行する。
セミコロンは前の処理を待つが、その終了状態を実行条件にはしない。通常ファイルの有無にかかわらず表示されるので、成功例だけを試すと違いを見落とす。
test -f app.conf & echo READY&は左側をバックグラウンド化し、成功条件を判定しない。
testはバックグラウンドで実行され、echoはその結果を待って分岐しない。READYが見えたことから、バックグラウンドのtestが成功したとは判断できない。必要なら別にwaitで結果を受け取る。
実際に確かめる
一時的な検証環境で実行できる例です。
LAB_DIR=$(mktemp -d) || exit 1
(
cd "$LAB_DIR" || exit 1
: > app.conf
mkdir dir.conf || exit 1
test -f app.conf && printf 'present: READY\n'
test -f missing.conf && printf 'missing: READY\n'
printf 'missing status=%s\n' "$?"
test -f dir.conf && printf 'directory: READY\n'
printf 'directory status=%s\n' "$?"
rm -- app.conf
rmdir -- dir.conf
)
rmdir -- "$LAB_DIR"参考にした公式資料
期待される結果
present: READY
missing status=1
directory status=1理解のポイント
- &&の短絡評価
- 終了状態0
- 条件付き実行
確認時の注意
- 確認環境: Bash 5.2 / GNU coreutils。新規Bashの通常設定(errexitは無効)。作成した一時ディレクトリ内の通常ファイル・不存在・ディレクトリを比較する。
- 検証は新規Bashで実行し、作成できた一時ディレクトリ内の名前だけを使う。削除は作成したファイルと空ディレクトリに限定し、再帰削除は使わない。
- missingとdirectoryの状態は、対象のANDリスト直後に$?で取得する。途中に別のコマンドを挟むと、そのコマンドの状態へ更新される。
基礎のおさらい
成功と不成功の両方を確認する
通常ファイルがある例だけでは、&&、;、&の候補はいずれもREADYを表示し得る。不存在とディレクトリの例も使い、右側を実行しない条件を確認する。
終了状態と標準出力
testは通常、画面へ値を表示せず終了状態で判定を伝える。&&は出力の文字列ではなく数値0を条件にする。
ファイルの種類を区別する
-fは単なる存在確認ではなく通常ファイルの条件である。ディレクトリが存在しても、この条件では非0となる。