web-dev-qa-db-ja.com

グロビングが有効かどうかをテストする

set +fおよびset -fを使用して、グロビングを有効/無効にできることを知っています。

しかし、それが現在有効になっているかどうかをどのようにテストできますか?

一意の名前でファイルを作成し、一致するはずのパターンを持つファイルが存在するかどうかをテストできます。ただし、よりクリーンな解決策があることを願っています。

4
z32a7ul

もし、するなら set -f、またはそれ以外の場合はグロビングを無効にします:、 $- にはfが含まれます:

$ echo $-
himBHs
$ set -f
$ echo $-
fhimBHs
$ bash -fc 'echo $-'
fhBc

そう:

[[ $- = *f* ]]

または:

case $- in
 *f*)  ... ;;
esac
11
muru

少なくとも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
7
Iguananaut

変数$-には現在のフラグが含まれています。

だからできる

case "$-" in
   (*'f'*) echo "file globbing is disabled" ;;
   (*)     echo "file globbing is enabled" ;;
esac
5
icarus

いくつかの方法があります。

  • 最も移植性の高いテストは$-

    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
    
3
Isaac