会員登録すると
学習することができます。
会員登録する(無料)
登録済みの方はこちら
ログイン

壊れにくく書く ― 失敗したら止める

目安学習時間 15分

課題

全問正解でレクチャー完了です。

【問題1】

「set -e」を付けたスクリプトで、途中のコマンドが失敗したときに起きることはどれですか。

[選択肢]

【問題2】

「set -u」が無い場合、打ち間違えた変数はどう扱われますか。

[選択肢]
会員登録すると
学習することができます。
会員登録する(無料)

学ぶ目的

既定では、失敗しても先へ進んでしまう

シェルは、途中のコマンドが失敗しても次の行を実行します。バックアップに失敗したまま削除まで進む、といった事故がこれで起きます。

冒頭の1行で挙動を変えられます。

set -euo pipefail

3つの指定がまとまっています。

指定 意味
-e コマンドが失敗したら、そこで止める
-u 未定義の変数を使ったらエラーにする
-o pipefail パイプの途中で失敗しても気づけるようにする

実際に確かめる

次のスクリプトを実行します。words.txtzzz は入っていません。

#!/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が書いたスクリプトを受け取ったら、実行する前にこの順で見ます。

  1. set -euo pipefail が入っているか
  2. 変数は引用符で囲まれているか
  3. 消す操作(rm)の対象が、変数で組み立てられていないか。組み立てるなら、空だったときに何が消えるかを確かめる
  4. 実行対象が想定のディレクトリの外に出ないか
  5. 同じスクリプトを2回実行しても壊れないか

このレクチャーで学ぶこと

  • set -euo pipefail の3つの意味
  • 失敗で止まることの確認
  • AIの出力をレビューする5つの観点

質問

まだ質問は投稿されていません。

質問投稿

ログイン後に質問の投稿ができます。