【 shopt 】コマンド(応用編その5)――「**」によるパス名展開を可能にするLinux基本コマンドTips(366)

本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、bashのシェルオプションを設定する「shopt」コマンドです。

» 2019年12月26日 05時00分 公開
[西村めぐみ@IT]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「Linux基本コマンドTips」のインデックス

Linux基本コマンドTips一覧

 本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。基礎編応用編(その1)応用編(その2)応用編(その3)応用編(その4)に引き続き、今回も、bashのシェルオプションを設定する「shopt」コマンドについて紹介します。

shoptコマンドとは?

 「shopt」はbashの動作設定(シェルオプション)を表示、設定するコマンドです。

 shoptはbashのビルトインコマンド(内部コマンド、シェルコマンド)です(※1)。「man」コマンドではなく、「help」コマンドや「man bash」で詳細を確認します。

※1 シェルオプションは、「set」コマンド(連載第205回連載第207回連載第208回)で設定できるものと、shoptコマンドで設定できるものに分かれている。shoptはbash 2.0で追加されたコマンド。



 今回は、shoptコマンドで設定できるシェルオプションのうち、「**」によるパス名展開を可能にする「globstar」について取り上げます。bashのバージョン4以降で使用可能です。併せてドットファイルをパス名展開の対象にする「dotglob」も紹介します。

 shoptコマンドの基本的な使い方については、連載第361回をご確認ください。



コマンドの書式

shopt [オプション]

※ [ ]は省略可能な引数を示しています。




shoptの主なオプション

短いオプション 意味
-s シェルオプション 指定したシェルオプションを有効(on)にする
-u シェルオプション 指定したシェルオプションを無効(off)にする
-o 「set -o」で指定できるシェルオプションを対象にする
-p シェルオプションの設定状況を、「shopt -s(または-u) オプション」という書式で一覧表示する(※2)
-q メッセージを出力しない(無効なシェルオプションを指定したといったエラーメッセージは出力する)

※2 「shopt -p」の出力結果をファイルに保存しておくと、定義ファイルとして利用できるため、シェルオプションの設定を元に戻す際などに役立つ。



shopt用の主なシェルオプション(cd関連)

シェルオプション 意味
autocd ディレクトリ名のみで「cd」コマンドを実行する(対話シェルのみ)
cdable_vars cdコマンドの引数として変数を使用できるようにする
cdspell cdコマンドで指定したディレクトリの軽微なミス(文字の入れ替わり、1文字欠けている、1文字多い)を修正して実行する(対話シェルのみ)

shopt用の主なシェルオプション(補完、パス名展開、変数展開関連)※3

シェルオプション 意味
dirspell 指定したディレクトリが存在しない場合、補完の際にディレクトリ名の訂正を試みる
force_fignore 補完の際にシェル変数「FIGNORE」で指定した接尾辞を無視する(デフォルトで有効)
no_empty_cmd_completion 空行に対するコマンド補完を行う際に、補完候補をPATHから検索しない(※4)
failglob パス名展開でファイル名のマッチに失敗した場合、エラーにする
nullglob パス名展開ができなかった場合、空文字列にする
globstar パス名展開で「**」を使用可能にする(ディレクトリ下のファイルを再帰的に検索して全てのファイルにマッチする、本文を参照
dotglob 「.」(ドット)で始まるファイル名をパス名展開の結果に含める本文を参照
extglob パス名展開で、「?(パターンリスト)」のように、「?」「*」「+」「@」「!」と「()」を組み合わせたパターン指定(拡張パターンマッチング)を使用する(※5)
nocaseglob パス名展開の際に、ファイル名の大文字と小文字を区別しない
nocasematch 「case」コマンドや「[[」実行時のパターンマッチで大文字と小文字を区別しない
progcomp プログラム補完機能を使用する(デフォルトで有効)
expand_aliases エイリアスの展開を行う(デフォルトで有効)
hostcomplete 「@」記号でホスト名展開を行う(デフォルトで有効、※4)
extquote ダブルクオート中にある「${パラメーター}」の展開で、「$'文字列'」と「$"文字列"」のクオートを機能させる(デフォルトで有効)
promptvars プロンプト文字列に対して、パラメーター展開やコマンド置換、算術式展開、クオート削除を行う(デフォルトで有効)
xpg_echo 「echo」コマンドで、「-e」オプションがない場合でも、バックスラッシュによるエスケープシーケンスを展開する

※3 補完については「complete」コマンド(連載第321回)も参照。
※4 readlineを使用することが前提となる(デフォルトで有効)。readlineはコマンドライン編集などで使うライブラリ。
※5 CentOS 7ではデフォルトで有効。



shopt用の主なシェルオプション(ヒストリー関連)

シェルオプション 意味
cmdhist 複数行に分けて入力したコマンドラインを、1行のヒストリーとして保存する(デフォルトで有効)
lithist cmdhistオプションが有効な場合、複数行に分けて入力したコマンドラインを「;」区切りではなく改行区切りでヒストリーに保存する
histappend シェルの終了時に、シェル変数HISTFILEで指定したファイルにヒストリーのリストを追加する(上書きしない、※6)
histreedit 失敗したヒストリー置換を再編集できるようにする(「!番号」で該当するヒストリーがない場合、コマンドラインに「!番号」を再表示する、※7)
histverify 「!」記号でヒストリーを置換した結果を、すぐに実行するのではなくコマンドラインに表示する

※6 CentOS 7ではデフォルトで有効。
※7 readlineを使用することが前提となる(デフォルトで有効)。



shopt用の主なシェルオプション(互換関連など)

シェルオプション 意味
compat31 条件コマンド「[[」で、「=~」演算子に対するクオートの付いた引き数の扱いをbash 3.1の動作に変更する
compat32 条件コマンド「[[」で、「<」演算子と「>」演算子によるロケール固有の文字列比較の扱いをbash 3.2の動作に変更する
compat40 条件コマンド「[[」で、「<」演算子と「>」演算子によるロケール固有の文字列比較の扱いとコマンドリストの解釈の効果をbash 4.0の動作に変更する
compat41 POSIXモードの際に、ダブルクオートの中のパラメーター展開でシングルクオートを特殊文字として扱う(bash 4.1互換の動作)
gnu_errfmt シェルのエラーメッセージをGNU標準の形式で出力する

shopt用の主なシェルオプション(コマンド終了時、シェル終了時)

シェルオプション 意味
checkjobs 対話シェルが終了する前に、停止中や実行中のジョブの状態を表示する
huponexit 対話ログインシェルを終了する際に、全てのジョブにSIGHUPシグナルを送る(※8)
execfail 「exec」コマンドへの引き数として指定したファイルが実行できなくても、非対話シェルを終了しない(対話シェルがexecに失敗しても終了しない)
checkwinsize コマンドを実行した際に、端末画面の大きさをチェックしてシェル変数LINESとCOLUMNSの値を更新する(※9)

※8 関連記事「Linuxの「シグナル」って何だろう?」を参照。
※9 CentOS 7ではデフォルトで有効。



shopt用の主なシェルオプション(その他)※10

シェルオプション 意味
checkhash ハッシュテーブル(連載第96回)で見つけたコマンドを実行する前に、コマンドが実際に存在するかどうか確認する
sourcepath 「source」コマンド(「.」コマンド)で、指定したファイルをPATHから探す(デフォルトで有効)
lastpipe ジョブ制御が有効な場合、バックグラウンドでの実行ではないパイプラインの最後のコマンドを、現在のシェル環境で実行する
interactive_comments 「#」以降を無視する(コメント扱いにする、デフォルトで有効)
shift_verbose 「shift」コマンドで、シフトの回数が位置パラメーターの数を超えた場合、エラーメッセージを出力する
mailwarn メールのファイルがアクセス済みである場合に「The mail in メールファイル名 has been read」というメッセージを表示する
login_shell ログインシェルとして起動すると自動設定される(変更不可)
restricted_shell シェルを制限モードで起動した場合に自動設定される(変更不可)
extdebug デバッガ用の動作を有効にする(具体的な内容については「man bash」を参照)

※10 この他、「shopt -o」で、setコマンド用のシェルオプションが設定できる。





パス名展開で「**」を使用する

 シェル変数「globstar」を有効にすると、「**」によるパス名展開を使用できるようになります。

 「**」は0個以上のディレクトリにマッチします。例えば「**/*.txt」のように指定すると、「カレントディレクトリとカレントディレクトリ以下の全てのディレクトリを調べて拡張子が.txtであるファイル」にマッチします。つまり、いくら深い位置にあるファイルであってもマッチの対象になります。

コマンド実行例

shopt -s globstar

(「globstar」を有効にする)

shopt -u globstar

(「globstar」を無効にする)


 画面1では、カレントディレクトリ下に「file.csv」と「file.txt」というファイル、「subdir1」と「subdir2」というディレクトリを作った環境で「ls」コマンドを実行しています。

 最初に、確認のため実行したlsコマンドの「-R」オプションはサブディレクトリ下も再帰的に表示するオプション、「-F」はディレクトリ名の場合「/」記号を付けて表示するオプションです。

 「subdir1」下には「file1.txt」と「subsubdir1」ディレクトリ、さらに「subsubdir1」ディレクトリには「file11.txt」があります。「subdir2」下には「file2.txt」があります。

 globstarが無効な場合(デフォルトの環境)、「ls **/*.txt」を実行すると、「subdir1」ディレクトリ下にある「file1.txt」と、「subdir2」ディレクトリ下にある「file2.txt」がマッチします(画面1の1)。これは「ls */*.txt」と同じ結果です。「**/」部分はカレントディレクトリ直下のサブディレクトリ名に展開されています。

 これに対し、globstarが有効になっていると、「**/」部分が0個以上のディレクトリにマッチするようになります(画面1の2)。従って、カレントディレクトリ直下にある「file.txt」も、「subdir1」ディレクトリ下の「subsubdir2」ディレクトリにある「file11.txt」も表示されています。

画面1 画面1 シェルオプション「globstar」を有効にしたところ


globstar有効時もドットファイルの扱いは通常のパス名展開と同じ

Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。