set +f
およびset -f
を使用して、グロビングを有効/無効にできることを知っています。
しかし、それが現在有効になっているかどうかをどのようにテストできますか?
一意の名前でファイルを作成し、一致するはずのパターンを持つファイルが存在するかどうかをテストできます。ただし、よりクリーンな解決策があることを願っています。
もし、するなら set -f
、またはそれ以外の場合はグロビングを無効にします:、 $-
にはf
が含まれます:
$ echo $-
himBHs
$ set -f
$ echo $-
fhimBHs
$ bash -fc 'echo $-'
fhBc
そう:
[[ $- = *f* ]]
または:
case $- in
*f*) ... ;;
esac
少なくともbash
では、これがシェル固有のものかどうかはわかりません。test -o <optname>
を使用できます。 -f
に対応するオプション名はnoglob
なので、次のように実行できます。
$ set -f
$ test -o noglob; echo $?
$ set +f
$ test -o noglob; echo $?
または、スクリプトでは、
if [ -o noglob ]; then
echo globbing disabled
else
echo globbing enabled
fi
変数$-
には現在のフラグが含まれています。
だからできる
case "$-" in
(*'f'*) echo "file globbing is disabled" ;;
(*) echo "file globbing is enabled" ;;
esac
いくつかの方法があります。
最も移植性の高いテストは$-
set -f; [ -z "${-##*f*}" ] && echo noglob set
Bashといくつかのシェルでは:
[ -o noglob ] && echo noglob
いくつかのシェルのテストは次のとおりです。
set -o | grep noglob
Bash専用のものは次のとおりです。
$ shopt -op noglob
shopt -o noglob # +o if globbing is active.
また、サイレントテストが必要な場合:
if shopt -oq noglob; then echo noglob set; fi
グロビングが何をするかでテストすることもできます(かなり移植可能):
set -- .*; if [ "$#" -gt 1 ]; then echo glob active; fi