shopt は Bash の「シェル固有オプション」を有効化/無効化するための組み込みコマンドです。グロブ(* など)の挙動やエイリアス展開、履歴の扱い等を細かく制御できます。
実務では、globstar による再帰グロブ、extglob による拡張パターン、nullglob/failglob による未一致時の挙動変更などで、スクリプトの堅牢化や作業効率化に使います。
構文(Syntax)
# 基本
shopt [-pqsu] [-o] [OPTNAME ...]
# よく使う形
shopt # shopt系オプションの一覧を表示(on/off)
shopt -p # 再現可能な形式で出力(例: 'shopt -s globstar')
shopt -s OPTNAME # オプションを有効化
shopt -u OPTNAME # オプションを無効化
shopt -q OPTNAME # 何も表示せず、設定状態を終了ステータスで返す(0=on, 1=off)
shopt -so SHELLOPT # -o 併用: 'set -o' 対象のシェルオプションも操作(例: noclobber)
主なオプション一覧
表内の「オプション」には コマンドのフラグ(例:
-s)と 設定名(例:extglob)の両方を載せています。
| オプション | 説明 | 使用例 |
|---|---|---|
-s / -u | OPTNAME を有効化/無効化 | shopt -s globstar / shopt -u globstar |
-q | 出力せず状態だけを終了コードで返す | `shopt -q extglob |
-p | 現在の設定を再現可能なコマンド列で表示 | `shopt -p |
-o | set -o 系(noclobber など)の操作対象を切替 | shopt -so noclobber |
extglob | 拡張グロブを有効化(`@(a | b), !(pat)` など) |
globstar | ** で再帰グロブ | shopt -s globstar; printf '%s\n' **/*.sh |
nullglob | 未一致のグロブを空列に展開(そのままの文字列にしない) | shopt -s nullglob; echo *.nosuch |
failglob | 未一致のグロブでエラーにする | shopt -s failglob; echo *.nosuch |
dotglob | .* を含めてグロブ(隠しファイルも一致) | shopt -s dotglob; echo * |
nocaseglob | 大文字小文字を区別せずにグロブ | shopt -s nocaseglob; ls *.JPG |
expand_aliases | 非対話シェルでもエイリアス展開 | shopt -s expand_aliases; alias ll='ls -l'; ll |
histappend | 履歴を上書きせず追記 | shopt -s histappend |
checkwinsize | コマンド実行後に端末サイズを再取得 | shopt -s checkwinsize |
lastpipe | パイプの最終コマンドを現在のシェルで実行(対話外、ジョブ制御Off時) | `set +m; shopt -s lastpipe; seq 3 |
実行例
拡張グロブで除外パターンを使う
説明:*.md 以外のファイルだけ列挙します。
コマンド
shopt -s extglob
printf '%s\n' !(*.md)
** でサブディレクトリまで再帰的に検索
説明:リポジトリ内のすべてのシェルスクリプトを列挙します。
コマンド
shopt -s globstar
printf '%s\n' **/*.sh
未一致をエラーにして早期に失敗させる(failglob)
説明:指定パターンに一致しない場合は即エラーにします。
コマンド
shopt -s failglob
echo build/*.tar.gz
echo $? # 1(未一致なら)
出力例(例)
bash: no match: build/*.tar.gz
1
設定状態を判定して条件分岐(-q)
説明:設定が有効かどうかを終了コードでチェックします。
コマンド
if shopt -q nullglob; then
echo "nullglob=on"
else
echo "nullglob=off"
fi
set -o 系を shopt で切り替え(-o)
説明:noclobber を有効にして既存ファイルの上書きを防ぎます。
コマンド
shopt -so noclobber
echo "data" > existing.txt # 既存なら失敗(非0)
エラー例:存在しないオプション名
説明:綴りを誤るとエラー終了します。
コマンド
shopt -s no_such_option
echo $?
出力例(例)
bash: shopt: no_such_option: invalid shell option name
2
関連コマンド
set -o / set +o:POSIX系のシェルオプションを切り替え(pipefail/nounsetなど)。enable:ビルトインの有効/無効化。complete/compgen:補完機能。shoptの一部(progcomp*)と関係。bind:キーバインド設定(Readline)。- 変数
BASHOPTS/SHELLOPTS:現在有効なshopt/set -oの一覧を:区切りで保持。
備考
- 対象シェル:
shoptは Bash専用。dashや純POSIXshにはありません。zshではsetopt/unsetoptを使用します。 - 互換性:
globstar(**)やdirexpandなどは Bash の比較的新しい機能です。古い Bash では存在しない可能性があるため、スクリプトでは存在確認(shopt -q globstar)やフォールバックを検討してください。 - スクリプトでの影響範囲:
shoptは現在のシェルに影響します。関数やサブシェルのスコープを意識し、必要なら元に戻す(shopt -u ...)か、限定的に使いましょう。 - 未一致時の挙動:
nullglob/failglob/既定(未一致をそのまま文字列)で結果が大きく異なります。パターン展開を使う処理では明示的に決めておくのが安全です。 - 再現可能な設定の保存:
shopt -p(やshopt -po)の出力を.bashrc等に貼ると、同じ環境を再現できます。
参考
- Bash Reference Manual(Bourne Shell Builtins /
shopt)
https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html bash(1)manページ(シェルオプションとshopt)
https://man7.org/linux/man-pages/man1/bash.1.html- Bash パターン拡張(
extglobの書式)
https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html

コメント