会員登録すると
学習することができます。
会員登録する(無料)
学習することができます。
登録済みの方はこちら
ログイン
学ぶ目的
既定では、失敗しても先へ進んでしまう
シェルは、途中のコマンドが失敗しても次の行を実行します。バックアップに失敗したまま削除まで進む、といった事故がこれで起きます。
冒頭の1行で挙動を変えられます。
set -euo pipefail
3つの指定がまとまっています。
| 指定 | 意味 |
|---|---|
-e |
コマンドが失敗したら、そこで止める |
-u |
未定義の変数を使ったらエラーにする |
-o pipefail |
パイプの途中で失敗しても気づけるようにする |
実際に確かめる
次のスクリプトを実行します。words.txt に zzz は入っていません。
#!/usr/bin/env bash
set -euo pipefail
echo "開始"
grep zzz words.txt
echo "ここは実行されない"
出力は 開始 だけで、終了コードは1になります。最後の行は実行されません。set -e が無ければ、失敗を無視して「ここは実行されない」まで表示されてしまいます。
未定義の変数
-u があると、打ち間違えた変数名がその場で分かります。
set -u
echo "値=${MISSING}"
MISSING: 未割り当ての変数です のようなエラーになります。-u が無いと空文字として扱われ、気づかないまま空のパスを操作するといった事故につながります。
AIの出力をレビューする観点
AIが書いたスクリプトを受け取ったら、実行する前にこの順で見ます。
-
set -euo pipefailが入っているか - 変数は引用符で囲まれているか
-
消す操作(
rm)の対象が、変数で組み立てられていないか。組み立てるなら、空だったときに何が消えるかを確かめる - 実行対象が想定のディレクトリの外に出ないか
- 同じスクリプトを2回実行しても壊れないか
このレクチャーで学ぶこと
- set -euo pipefail の3つの意味
- 失敗で止まることの確認
- AIの出力をレビューする5つの観点
質問
まだ質問は投稿されていません。
質問投稿
ログイン後に質問の投稿ができます。