set は シェル組み込みコマンドで、エラー時の挙動や展開方法などの動作オプションを切り替えたり、$1 などの位置パラメータを設定・一覧表示します。
スクリプトの安全性向上(-e -u -o pipefail 等)や、set -- ... による引数の上書きに使われます。
構文(Syntax)
# 代表的な形(bash / POSIX sh 準拠の記法)
set [ -abefuvxCEn ] [ -o OPTION ]... # オプションを有効化
set +<同上> # 無効化(+で反転)
set -o # 現在のオプション一覧(bash 等)
set +o # 復元用の書式で一覧(bash 等)
set -- [ARG1 [ARG2 ...]] # 位置パラメータを設定($1.. を上書き)
-o nounsetのように 長名でも切り替え可能(シェルにより差異あり)。--以降は位置パラメータとして保存され、$#,$@,$1…で参照できます。
主なオプション一覧
下表は bash を中心に、POSIX 共通のものを優先して記載。シェルにより有無・意味が異なる場合があります。
| オプション | 説明 | 使用例 |
|---|---|---|
-e / -o errexit | エラーで即時終了(多くの例外あり※) | set -e |
-u / -o nounset | 未定義変数を参照するとエラー | set -u; echo "$FOO" |
-x / -o xtrace | 実行するコマンドをトレース表示 | set -x |
-v | 読み込んだシェル入力行を表示(verbose) | set -v |
-f / -o noglob | パス名展開(glob)を無効 | set -f |
-n / -o noexec | 構文チェックのみで実行しない | set -n; . script.sh |
-C / -o noclobber | > で既存ファイルを上書き禁止 | set -C |
-a / -o allexport | 以降の変数代入を自動的に export | set -a |
-b / -o notify | ジョブ終了を直ちに通知 | set -b |
-m / -o monitor | ジョブ制御を有効(対話では既定) | set -m |
-o pipefail | パイプ列のいずれかが失敗したら失敗(bash/zsh/ksh 等) | set -o pipefail |
-o posix | POSIX 互換モードに切替(bash) | set -o posix |
-- | ここでオプション終端/後続を位置パラメータに設定 | set -- a b c |
※
-eはif条件内、||/&&、while、サブシェル、関数などで発火しないケースが多数あります(備考参照)。
実行例
スクリプトを“堅く”する定番セット
説明: 早期失敗・未定義検出・パイプ失敗検出・トレース。
コマンド(スクリプト先頭など):
set -euxo pipefail
# ...本体...
-e(失敗で終了)、-u(未定義はエラー)、-x(実行ログ)、-o pipefail(パイプのどれか失敗で失敗)。
位置パラメータを上書きしてループ処理
説明: 引数が無い時にデフォルトのリストを与える。
コマンド:
[ "$#" -gt 0 ] || set -- file1.txt file2.txt
for f in "$@"; do
echo "processing $f"
done
一時的にグロブを無効化して安全に扱う
説明: ワイルドカードを文字列として扱いたいとき。
コマンド:
set -f # noglob
pattern="*.log"
grep ERROR -- "$pattern"
set +f
コマンドトレースを詳細化(ファイル名・行番号付き)
説明: デバッグ向けに PS4 を調整。
コマンド:
export PS4='+ ${BASH_SOURCE}:${LINENO}:${FUNCNAME[0]}: '
set -x
myfunc() { echo hi; }
myfunc
set +x
エラー例:-u で未定義変数を参照
説明: -u 有効時に未定義を使うと即時終了します。
コマンド:
set -u
echo "$NOT_DEFINED"
出力例(例):
bash: NOT_DEFINED: unbound variable
関連コマンド
shopt(bash):履歴展開・グロブ挙動など bash 固有オプションを切替。setopt(zsh):zsh の各オプションを切替(set -oとは別系統)。export/unset:環境変数の公開 / 変数の削除。env:一時的に環境を変えてコマンド実行。trap:ERR/EXITなどのシグナル/擬似シグナルにハンドラを設定。
備考
- シェルによる差異:
setは外部コマンドではなくビルトイン。bash/dash/zsh/kshでサポートするオプションが異なります。例えばpipefailは POSIXshには無く、dashでも未対応です。 -eの落とし穴: 失敗で即終了させる-eは、条件式や論理演算子(cmd || fallback)・パイプ・サブシェル等で期待通りに止まらない/止まりすぎることがあります。堅牢にするにはset -euo pipefailに加え、明示的にステータスを判定するか、重要箇所で|| exit 1を併用、またはtrap '...' ERRとset -Eを使ってエラー伝播を設計しましょう。set -o/+oの一覧: bash ではset -oで on/off 一覧、set +oで復元用コマンド形式(set +o nounsetなど)を表示できます。- 位置パラメータ:
set --を使うと$#/$@を自在に差し替えできます。元に戻す自動機構はないので、必要なら別変数に退避して管理します。 - 安全なリダイレクト:
set -C時に上書きしたい場合は>|で明示します(bash)。 - 永続化: 対話用の既定は
~/.bashrc、ログインシェルは~/.profile/~/.bash_profileなどにset -o ...を記述します(スクリプトはファイル先頭に書くのが一般的)。
参考
- GNU Bash リファレンス(The Set Builtin)
https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html - Bash マニュアル(Shell Options / Builtins)
https://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-Builtins.html - POSIX
set仕様
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/set.html - bash(1) man(オプション一覧・
pipefailなど)
https://man7.org/linux/man-pages/man1/bash.1.html - zsh オプション一覧(setopt)
https://zsh.sourceforge.io/Doc/Release/Options.html

コメント