bashのシェルオプションは40個以上あり、すべてを使いこなすのは難しいですが、実務で押さえるべきは10個ほどです。
この記事では、シェルのオプション機能を set コマンドで切り替える基本から、シェルスクリプト品質を上げる set -e / -u / -o pipefail、対話シェルで安全性を高める noclobber まで、現場で実際に使うオプションに絞って解説します。
bash 5.x / RHEL 9 / Rocky Linux 9 / Ubuntu 24.04 LTS で動作確認済みです。
この記事のポイント
・bash の set コマンドでシェルのオプションをon/offできる
・スクリプトには set -euo pipefail を入れるのが現場の標準
・対話シェルでは noclobber を有効にして上書き事故を防げる
・現在の設定一覧は set -o で確認できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
シェルのオプション機能と set コマンドの書式
シェルには様々なオプション機能があります。オプション機能は、「set」コマンドを使用してオン、オフを切り替えします。
# 書式 set [-o][+o] オプション
直感に反して、「-」がオン、「+」がオフです。bashの伝統的な書式なので、覚えるしかありません。
bash の主なオプション一覧
主なオプションは下記があります。| オプション名 | 動作 |
|---|---|
| allexport | 作成、変更した変数を自動的にエクスポートする |
| ignoreeof | Ctrl+dによってログアウトしないようにする |
| noclobber | 出力リダイレクトによるファイル上書きを禁止する |
| noglob | メタキャラクタを使ったファイル名展開を無効にする |
| emacs | emacs風のキーバインドにする |
| vi | vi風のキーバインドにする |
| errexit (-e) | コマンドが失敗したら即座にスクリプトを終了する |
| nounset (-u) | 未定義変数の参照をエラーにする |
| pipefail | パイプライン途中の失敗を全体の失敗として扱う |
| xtrace (-x) | 実行コマンドを表示しながら動く(デバッグ用) |
noglob オプションでメタキャラクタの展開を無効にする実例
例えば、デフォルトでは「*」や「?」のようなメタキャラクタの展開機能は有効ですが、noglobオプションを有効にすると、「*」を使ったファイル展開ができなくなります。[pakira@Tiger ~]$ ls *.sh 1.sh 2.sh [pakira@Tiger ~]$ set -o noglob ←noglobオプションを有効にします。 [pakira@Tiger ~]$ ls *.sh ls: cannot access *.sh: そのようなファイルやディレクトリはありません [pakira@Tiger ~]$ touch *.sh ←「*.sh」ファイルを作成します。 [pakira@Tiger ~]$ ls *.sh ←「*.sh」ファイルのみマッチします。 *.sh
[pakira@Tiger ~]$ set +o noglob
日常的なシェル操作で有効にすると、find や ls がほぼ使えなくなるため、対話シェルでの常用は避けるのが無難です。
シェルの現在のオプション設定を確認する:set -o
設定されているオプションを確認するには「set -o」を実行します。[pakira@Tiger ~]$ set -o allexport off braceexpand on emacs on errexit off errtrace off functrace off hashall on histexpand on history on ignoreeof off interactive-comments on keyword off monitor on noclobber off noexec off noglob off nolog off notify off nounset off onecmd off physical off pipefail off posix off privileged off verbose off vi off xtrace off
【重要】シェルスクリプトに入れるべき set -euo pipefail
シェルスクリプトの先頭に書くべき定番のオプション3点セットがあります。#!/usr/bin/env bash set -euo pipefail # ここからスクリプト本体
・-e(errexit):コマンドが失敗(終了コード非ゼロ)したら即座にスクリプトを終了します。エラーを握り潰さず、早期発見できます。
・-u(nounset):未定義変数を参照したらエラーにします。タイプミスや初期化漏れを検出できます。
・-o pipefail:パイプライン(cmd1 | cmd2)の途中で失敗があれば全体を失敗扱いにします。デフォルトでは最後のコマンドの終了コードしか見ないので、握り潰し事故が起こります。
この3点を入れるだけで、シェルスクリプトの品質が大きく上がります。
特に本番環境で動かす自動化スクリプトでは、set -euo pipefail はほぼ必須です。
noclobber オプションで対話シェルの上書き事故を防ぐ
対話シェルでよくある事故が、リダイレクト(>)でファイルを上書きしてしまうことです。ログファイルを「>>」で追記するつもりが「>」で書いてしまい、過去ログ全消失というのは現場でよく起こります。
noclobber オプションを有効にすると、既存ファイルへの > リダイレクトがエラーになります。
$ set -o noclobber $ echo "test" > existing_file.txt -bash: existing_file.txt: cannot overwrite existing file $ echo "test" >> existing_file.txt (追記は成功する)
$ echo "test" >| existing_file.txt (>| なら強制上書き可能)
xtrace オプション(set -x)でシェルスクリプトをデバッグする
シェルスクリプトの動きを追いたい時は、xtrace オプション(set -x)が役に立ちます。実行されるコマンドが「+」付きで標準エラー出力に表示されます。
#!/usr/bin/env bash set -x NAME="pakira" echo "Hello, $NAME"
$ ./test.sh + NAME=pakira + echo 'Hello, pakira' Hello, pakira
echo "ここはトレースしない" set -x echo "ここはトレース対象" NAME="pakira" set +x echo "ここはトレースしない"
# bash -x でスクリプトを起動するとset -x相当 $ bash -x test.sh
ignoreeof オプション:Ctrl+d による誤ログアウトを防ぐ
ignoreeofオプションを有効にすると、Ctrl+d を押してもシェルがログアウトしなくなります。viエディタを抜けたつもりが、Ctrl+d でsshセッションごと切れた、という事故を防ぐためのオプションです。
$ set -o ignoreeof $ Ctrl+d Use "exit" to leave the shell.
~/.bashrc に set -o ignoreeof を書いておくと常時有効になります。
「unbound variable」「set: unbound variable: xxx」が出た時の対処
set -u(nounset)を有効にしたシェルスクリプトで、よくあるエラーが「unbound variable」です。$ bash -c 'set -u; echo $UNDEFINED_VAR' bash: UNDEFINED_VAR: unbound variable
対処法は2つあります。
・変数を必ず初期化する:スクリプト冒頭で MY_VAR="" のように空文字でもいいので初期化します。
・デフォルト値を指定する:${VAR:-default} の書式で未定義時の代替値を指定します。
# デフォルト値で逃げる $ bash -c 'set -u; echo "${UNDEFINED_VAR:-empty}"' empty
本記事のまとめ
シェルのオプションは set コマンドで切り替えますが、対話シェルとシェルスクリプトで使い分ける場面が異なります。スクリプトの先頭には set -euo pipefail を、対話シェルには noclobber や ignoreeof を入れておくのが現場の標準です。
| やりたいこと | コマンド |
|---|---|
| シェルスクリプトの品質を上げる定番3点セット | set -euo pipefail |
| 現在のオプション設定一覧を表示 | set -o |
| 対話シェルで > による上書きを禁止 | set -o noclobber |
| Ctrl+d によるログアウトを禁止 | set -o ignoreeof |
| シェルスクリプトをトレース実行 | set -x または bash -x スクリプト名 |
| オプションを無効化(offに)する | set +o オプション名 |
| 未定義変数のデフォルト値指定 | ${VAR:-default} |
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:typeコマンドでシェル組み込みと外部コマンドを区別する方法|whichとの違いやalias確認も
- この記事の属するカテゴリ:シェルスクリプトへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます