"bash -c"に渡されたコマンドで角かっこで囲まれた拡張globをどのように使用できますか?

"bash -c"に渡されたコマンドで角かっこで囲まれた拡張globをどのように使用できますか?

拡張されたglobを使用しようとしていますが、それをbash -c機能させる方法が見つかりませんでした。

私が試したこと

  1. bash -c 'for f in *.!(ext); do echo $f; done'

    結果:

    bash: -c: line 0: syntax error near unexpected token `('
    

     

  2. bash -c 'for f in *.!\(ext\); do echo $f; done'

    結果:

    *.!(ext)
    

     

  3. bash -c 'for f in *.!$0; do echo $f; done' '(ext)'

    結果:

    *.!(ext)
    

     

  4. bash -c 'for f in "*.!(ext)"; do echo $f; done'

    結果:

    *.!(ext)
    

答え1

で拡張されたグローブモードを使用するには、何らかの方法でシェルオプションを有効にするbash必要があります。extglob

インラインスクリプトに対してこれを行う最も簡単な方法は、bash -cコマンドラインでオプションを使用してシェルオプションを設定することです。-O

bash -O extglob -c 'script code here'

直接電話することもできますshopt -s extglob スクリプト内でただし、シェルがコードを解析する方法を変更するので(シェルの構文を変更する)、この操作が別の行で実行されることを確認する必要があります。

bash -c 'shopt -s extglob
         script code here'

文字列で終わらないすべての名前を印刷する実際の操作は次のとおりです.ext

bash -O extglob -O dotglob -O nullglob -c 'printf "%s\n" !(*.ext)'

追加の設定dotglobnullglobオプションを使用すると、スクリプトは隠された名前を照合し、一致するものがない場合(拡張されていないパターンを印刷する代わりに)空白行を印刷します。

パターンは (not just) で*.!(ext)終わるファイル名を除外します。ext.extそしてドットを含まないファイル名。

関連情報