本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、bashのシェルオプションを設定する「shopt」コマンドです。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。基礎編、応用編(その1)、応用編(その2)、応用編(その3)、応用編(その4)に引き続き、今回も、bashのシェルオプションを設定する「shopt」コマンドについて紹介します。
「shopt」はbashの動作設定(シェルオプション)を表示、設定するコマンドです。
shoptはbashのビルトインコマンド(内部コマンド、シェルコマンド)です(※1)。「man」コマンドではなく、「help」コマンドや「man bash」で詳細を確認します。
今回は、shoptコマンドで設定できるシェルオプションのうち、「**」によるパス名展開を可能にする「globstar」について取り上げます。bashのバージョン4以降で使用可能です。併せてドットファイルをパス名展開の対象にする「dotglob」も紹介します。
shoptコマンドの基本的な使い方については、連載第361回をご確認ください。
shopt [オプション]
※ [ ]は省略可能な引数を示しています。
短いオプション | 意味 |
---|---|
-s シェルオプション | 指定したシェルオプションを有効(on)にする |
-u シェルオプション | 指定したシェルオプションを無効(off)にする |
-o | 「set -o」で指定できるシェルオプションを対象にする |
-p | シェルオプションの設定状況を、「shopt -s(または-u) オプション」という書式で一覧表示する(※2) |
-q | メッセージを出力しない(無効なシェルオプションを指定したといったエラーメッセージは出力する) |
※2 「shopt -p」の出力結果をファイルに保存しておくと、定義ファイルとして利用できるため、シェルオプションの設定を元に戻す際などに役立つ。
シェルオプション | 意味 |
---|---|
autocd | ディレクトリ名のみで「cd」コマンドを実行する(対話シェルのみ) |
cdable_vars | cdコマンドの引数として変数を使用できるようにする |
cdspell | cdコマンドで指定したディレクトリの軽微なミス(文字の入れ替わり、1文字欠けている、1文字多い)を修正して実行する(対話シェルのみ) |
シェルオプション | 意味 |
---|---|
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ではデフォルトで有効。
シェルオプション | 意味 |
---|---|
cmdhist | 複数行に分けて入力したコマンドラインを、1行のヒストリーとして保存する(デフォルトで有効) |
lithist | cmdhistオプションが有効な場合、複数行に分けて入力したコマンドラインを「;」区切りではなく改行区切りでヒストリーに保存する |
histappend | シェルの終了時に、シェル変数HISTFILEで指定したファイルにヒストリーのリストを追加する(上書きしない、※6) |
histreedit | 失敗したヒストリー置換を再編集できるようにする(「!番号」で該当するヒストリーがない場合、コマンドラインに「!番号」を再表示する、※7) |
histverify | 「!」記号でヒストリーを置換した結果を、すぐに実行するのではなくコマンドラインに表示する |
※6 CentOS 7ではデフォルトで有効。
※7 readlineを使用することが前提となる(デフォルトで有効)。
シェルオプション | 意味 |
---|---|
compat31 | 条件コマンド「[[」で、「=~」演算子に対するクオートの付いた引き数の扱いをbash 3.1の動作に変更する |
compat32 | 条件コマンド「[[」で、「<」演算子と「>」演算子によるロケール固有の文字列比較の扱いをbash 3.2の動作に変更する |
compat40 | 条件コマンド「[[」で、「<」演算子と「>」演算子によるロケール固有の文字列比較の扱いとコマンドリストの解釈の効果をbash 4.0の動作に変更する |
compat41 | POSIXモードの際に、ダブルクオートの中のパラメーター展開でシングルクオートを特殊文字として扱う(bash 4.1互換の動作) |
gnu_errfmt | シェルのエラーメッセージをGNU標準の形式で出力する |
シェルオプション | 意味 |
---|---|
checkjobs | 対話シェルが終了する前に、停止中や実行中のジョブの状態を表示する |
huponexit | 対話ログインシェルを終了する際に、全てのジョブにSIGHUPシグナルを送る(※8) |
execfail | 「exec」コマンドへの引き数として指定したファイルが実行できなくても、非対話シェルを終了しない(対話シェルがexecに失敗しても終了しない) |
checkwinsize | コマンドを実行した際に、端末画面の大きさをチェックしてシェル変数LINESとCOLUMNSの値を更新する(※9) |
※8 関連記事「Linuxの「シグナル」って何だろう?」を参照。
※9 CentOS 7ではデフォルトで有効。
シェルオプション | 意味 |
---|---|
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」も表示されています。
Copyright © ITmedia, Inc. All Rights Reserved.