set -uとは何か?未定義の変数で失敗させる
set -u(nounset)は、未定義の変数への参照を、静かに空文字列に置き換えるのではなく、エラーとして扱うようshellに指示します。
デフォルトでは、一度も設定されていない変数を使うと空文字列になり、$DIRが空のときにrm -rf "$DIR/"がルートから削除するといった惨事につながることがあります。set -uは、未設定の変数を即座のエラーに変えることでこれを防ぎます。これはset -euo pipefailのuです。
set -uが行うこと
set -uが有効なとき、値を持たない変数を参照すると、shellはエラーを表示して終了します。これは変数名の誤字や、一度も提供されなかった入力を捉えます。
それが防ぐ危険
set -uがないと、$TYPOED_VARは静かに空になります。空の変数から構築されたpathは破滅的な場所を指すことがあり、欠けた必須入力はbuildを設定なしで実行させてしまう可能性があります。
本物のバグを捉える
- 綴りを間違えた変数名が、沈黙ではなくエラーとして現れます。
- 欠けた必須の環境変数が素早く失敗します。
- 空のpathの誤りが、被害を引き起こす前に捉えられます。
デフォルトを提供する
変数が正当に任意である場合、"${VAR:-default}"を使ってfallbackを供給します。これはset -uと連携し、未設定変数のエラーを引き起こさずに値を与えます。
CIにおけるset -u
CIスクリプトは、一部のコンテキストで欠けているかもしれない環境変数やsecretに依存します。set -uは、欠けたsecretや入力を最初に大きく失敗させ、後で紛らわしく失敗する壊れたbuildを生み出さないようにします。
マネージドrunnerでの欠けた入力の捕捉
Latchkeyのrunnerでは、set -uは、環境変数を期待するステップがそれが無い場合に即座に失敗することを意味します。本当に任意の値には"${VAR:-}"のデフォルトと組み合わせて、ステップを安全かつ柔軟に保ちましょう。
重要なポイント
- set -uは、未設定の変数への参照を空文字列ではなくエラーにします。
- 誤字や欠けた必須入力を、被害が出る前に捉えます。
- 本当に任意の変数には
"${VAR:-default}"を使ってfallbackを提供します。
関連ガイド
What Is set -e? Failing a Script on the First Errorset -e makes a Bash script exit immediately when a command fails. Learn how it works, its caveats, and why it…
What Is set -o pipefail? Catching Pipeline Failuresset -o pipefail makes a pipeline fail if any command in it fails, not just the last. Learn why it is essentia…
What Is an Environment Variable? Config in the ShellAn environment variable is a named value processes inherit from their parent. Learn how env variables work an…