シェルのオプション|bash の set コマンドで切り替える主要オプション実務集

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)シェルスクリプト > シェルのオプション|bash の set コマンドで切り替える主要オプション実務集
「シェルスクリプトで set -e を入れるかどうか、毎回迷う」「ignoreeof は便利だけど、ログアウトできなくて困った」
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 で確認できる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

シェルのオプション機能と set コマンドの書式

シェルには様々なオプション機能があります。
オプション機能は、「set」コマンドを使用してオン、オフを切り替えします。

# 書式 set [-o][+o] オプション

-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

また、noglobオプションを無効にするには下記通り実行します。

[pakira@Tiger ~]$ set +o noglob

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

「off」のオプションを有効にしたい時は set -o オプション名、逆に「on」のオプションを無効にしたい時は set +o オプション名 を実行します。

【重要】シェルスクリプトに入れるべき 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 (追記は成功する)

どうしても上書きしたい場合は >| を使えば、noclobber を一時的に無効にできます。

$ echo "test" >| existing_file.txt (>| なら強制上書き可能)

~/.bashrc に set -o noclobber を書いておけば、対話シェル起動時に常時有効になります。

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

デバッグの一部分だけ追いたい時は、対象範囲の前後で set -x / set +x で挟みます。

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.

ログアウトしたい時は明示的に exit と入力する必要があり、誤操作対策として有効です。
~/.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 -u の本来の役割を活かしてください。

本記事のまとめ

シェルのオプションは 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}

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。