set – シェルの動作オプションや位置パラメータを設定する(シェル組み込み)

環境変数

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以降の変数代入を自動的に exportset -a
-b / -o notifyジョブ終了を直ちに通知set -b
-m / -o monitorジョブ制御を有効(対話では既定)set -m
-o pipefailパイプ列のいずれかが失敗したら失敗(bash/zsh/ksh 等)set -o pipefail
-o posixPOSIX 互換モードに切替(bash)set -o posix
--ここでオプション終端/後続を位置パラメータに設定set -- a b c

-eif 条件内、||/&&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:一時的に環境を変えてコマンド実行。
  • trapERR/EXIT などのシグナル/擬似シグナルにハンドラを設定。

備考

  • シェルによる差異: set外部コマンドではなくビルトインbash/dash/zsh/ksh でサポートするオプションが異なります。例えば pipefail は POSIX sh には無く、dash でも未対応です。
  • -e の落とし穴: 失敗で即終了させる -e は、条件式や論理演算子(cmd || fallback)・パイプ・サブシェル等で期待通りに止まらない/止まりすぎることがあります。堅牢にするには set -euo pipefail に加え、明示的にステータスを判定するか、重要箇所で || exit 1 を併用、または trap '...' ERRset -E を使ってエラー伝播を設計しましょう。
  • set -o/+o の一覧: bash では set -o で on/off 一覧、set +o で復元用コマンド形式(set +o nounset など)を表示できます。
  • 位置パラメータ: set -- を使うと $#/$@ を自在に差し替えできます。元に戻す自動機構はないので、必要なら別変数に退避して管理します。
  • 安全なリダイレクト: set -C 時に上書きしたい場合は >| で明示します(bash)。
  • 永続化: 対話用の既定は ~/.bashrc、ログインシェルは ~/.profile/~/.bash_profile などに set -o ... を記述します(スクリプトはファイル先頭に書くのが一般的)。

参考

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント