いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Bashで '**' の展開をONにする (globstar)

概要

以下、自分用のメモです。いつも忘れるので。。

業務でお客様の環境でシェル操作をする場合、勝手に設定変更して、それを保存しておくことはなかなか出来ません。

なので、一時的な設定変更を行って、作業終わりに元に戻すことが多いと思います。

んで、Linux上で作業している場合シェル操作が主になるのですが、** の展開をONにしていないと何かと不便ですので、よくONにして作業します。

が、いざ使い時に忘れてしまっているので、毎回うーんってなって思い出してます。(年ですね・・)

忘れないうちにここにメモしておきます。

まずは今の設定を出力しておく

shopt -s で有効化、shopt -u で無効化です。

最初に有効になってるかどうか、プラス、後で戻せるように今の設定を出しておきます。

$ shopt -p > shopt.txt

こんな風な内容が出力されます。

shopt -u autocd
shopt -u assoc_expand_once
shopt -u cdable_vars
shopt -u cdspell
shopt -u checkhash
shopt -u checkjobs
shopt -s checkwinsize
shopt -s cmdhist
shopt -u compat31
shopt -u compat32
shopt -u compat40
shopt -u compat41
shopt -u compat42
shopt -u compat43
shopt -u compat44
shopt -s complete_fullquote
shopt -u direxpand
shopt -u dirspell
shopt -u dotglob
shopt -u execfail
shopt -s expand_aliases
shopt -u extdebug
shopt -s extglob
shopt -s extquote
shopt -u failglob
shopt -s force_fignore
shopt -s globasciiranges
shopt -u globstar
shopt -u gnu_errfmt
shopt -s histappend
shopt -u histreedit
shopt -u histverify
shopt -u hostcomplete
shopt -u huponexit
shopt -u inherit_errexit
shopt -s interactive_comments
shopt -u lastpipe
shopt -u lithist
shopt -u localvar_inherit
shopt -u localvar_unset
shopt -u login_shell
shopt -u mailwarn
shopt -u no_empty_cmd_completion
shopt -u nocaseglob
shopt -u nocasematch
shopt -u nullglob
shopt -s progcomp
shopt -u progcomp_alias
shopt -s promptvars
shopt -u restricted_shell
shopt -u shift_verbose
shopt -s sourcepath
shopt -u xpg_echo

プラス、念の為、set コマンドで設定されている内容も出力しておきましょう。

$ shopt -po > set.txt

こんな風な内容が出力されます。

set +o allexport
set -o braceexpand
set -o emacs
set +o errexit
set +o errtrace
set +o functrace
set -o hashall
set -o histexpand
set -o history
set +o ignoreeof
set -o interactive-comments
set +o keyword
set -o monitor
set +o noclobber
set +o noexec
set +o noglob
set +o nolog
set +o notify
set +o nounset
set +o onecmd
set +o physical
set +o pipefail
set +o posix
set +o privileged
set +o verbose
set +o vi
set +o xtrace

後で元に戻す際に利用できます。(見て戻したりするのが多いとおもいますが、eval で一気に戻すことも出来ますね)

globstarを有効

以下で設定できます。

$ shopt -s globstar

これで '**' の展開が有効になりました。試してみましょう。

以下のようなディレクトリ階層とします。

$ tree 
.
├── dir1
│   ├── sub1
│   │   └── Taskfile.yml
│   └── Taskfile.yml
├── dir2
│   ├── sub2
│   │   └── Taskfile.yml
│   └── Taskfile.yml

globstar が無効の状態だと、以下のようになります。

$ shopt -u globstar
$ ls **/*.yml
dir1/Taskfile.yml  dir2/Taskfile.yml

globstarが有効な場合は以下のようになります。

$ shopt -s globstar
$ ls **/*.yml
dir1/sub1/Taskfile.yml  dir1/Taskfile.yml  dir2/sub2/Taskfile.yml  dir2/Taskfile.yml

参考情報

orebibou.com

atmarkit.itmedia.co.jp

qiita.com


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。