ワイルドカードが有効になっているかどうかをテストする

ワイルドカードが有効になっているかどうかをテストする

set +fワイルドカードを使用して有効/無効にできることを知っていますset -f

しかし、現在有効になっていることをどのようにテストしますか?

一意の名前を持つファイルを作成し、そのファイルと一致するパターンがあるかどうかをテストできます。それでも、よりクリーンなソリューションを期待しています。

答え1

これを行うか、set -fそうでなければグローブを無効にする場合:,$-含まれますf:

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

だから:

[[ $- = *f* ]]

または:

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

答え2

少なくともbashこれが利用可能なシェルに固有のものかどうかはわかりませんtest -o <optname>。対応するオプション名-fnoglob次のとおりです。

$ set -f
$ test -o noglob; echo $?
$ set +f
$ test -o noglob; echo $?

またはスクリプトから

if [ -o noglob ]; then
    echo globbing disabled
else
    echo globbing enabled
fi

答え3

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

だからあなたはできます

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

答え4

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

  • 最も携帯性に優れたテストが拡張されています。$-

    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
    
  • globbingを使用してテストすることもできます(非常に移植可能)。

    set -- .*; if [ "$#" -gt 1 ]; then echo glob active; fi
    

関連情報