shopt – シェルの動作オプションをオン/オフする(bash組み込み)

グロブ/パターン

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 / -uOPTNAME を有効化/無効化shopt -s globstar / shopt -u globstar
-q出力せず状態だけを終了コードで返す`shopt -q extglob
-p現在の設定を再現可能なコマンド列で表示`shopt -p
-oset -o 系(noclobber など)の操作対象を切替shopt -so noclobber
extglob拡張グロブを有効化(`@(ab), !(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 の一覧を : 区切りで保持。

備考

  • 対象シェルshoptBash専用dash や純POSIX sh にはありません。zsh では setopt/unsetopt を使用します。
  • 互換性globstar**)や direxpand などは Bash の比較的新しい機能です。古い Bash では存在しない可能性があるため、スクリプトでは存在確認(shopt -q globstar)やフォールバックを検討してください。
  • スクリプトでの影響範囲shopt現在のシェルに影響します。関数やサブシェルのスコープを意識し、必要なら元に戻す(shopt -u ...)か、限定的に使いましょう。
  • 未一致時の挙動nullglob/failglob/既定(未一致をそのまま文字列)で結果が大きく異なります。パターン展開を使う処理では明示的に決めておくのが安全です。
  • 再現可能な設定の保存shopt -p(や shopt -po)の出力を .bashrc 等に貼ると、同じ環境を再現できます。

参考

Bash玄

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

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

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

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

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

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

Bash玄をフォローする

コメント