で拡張 glob を使用しようとしていますbash -c
が、動作させる方法が見つかりません。
私が試したこと
bash -c 'for f in *.!(ext); do echo $f; done'
結果:
bash: -c: line 0: syntax error near unexpected token `('
bash -c 'for f in *.!\(ext\); do echo $f; done'
結果:
*.!(ext)
bash -c 'for f in *.!$0; do echo $f; done' '(ext)'
結果:
*.!(ext)
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
そしてドットを含まないファイル名。