`bash -c` に渡されるコマンドで括弧付きの拡張グロブを使用するにはどうすればよいでしょうか?

`bash -c` に渡されるコマンドで括弧付きの拡張グロブを使用するにはどうすればよいでしょうか?

で拡張 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)'

dotglobおよびオプションを追加で設定すると、nullglobスクリプトは隠し名前を一致させ、一致するものがない場合には (展開されていないパターンを印刷するのではなく) 1 つの空行を印刷します。

パターンでは、 (だけではなく)*.!(ext)で終わるファイル名は除外されることに注意してください。ext.extそしてドットを含まないファイル名。

関連情報