基本的な*
,?
および[...]
パターンに加えて、Bash シェルは、!(pattern-list)
(「指定されたパターンの 1 つを除くすべてに一致する」) のような拡張パターン マッチング演算子を提供します。それらを使用するには、extglob
シェルオプションを設定する必要があります。例:
~$ mkdir test ; cd test ; touch file1 file2 file3
~/test$ echo *
file1 file2 file3
~/test$ shopt -s extglob # make sure extglob is set
~/test$ echo !(file2)
file1 file3
サブシェルで実行するプログラムにシェル式を渡すと、演算子によってエラーが発生します。サブシェルを直接実行するテストを次に示します (ここでは、展開が時期尚早に発生しないことを確認するために、別のディレクトリから実行しています)。
~/test$ cd ..
~$ bash -c "cd test ; echo *"
file1 file2 file3
~$ bash -c "cd test ; echo !(file2)" # expected output: file1 file3
bash: -c: line 0: syntax error near unexpected token `('
bash: -c: line 0: `cd test ; echo !(file2)'
あらゆる種類のエスケープを試みましたが、思いついたものは何も正しく機能しませんでした。extglob
また、サブシェルに設定されていないのではないかと疑っていますが、そうではありません:
~$ bash -c "shopt -s extglob ; cd test ; echo !(file2)"
bash: -c: line 0: syntax error near unexpected token `('
bash: -c: line 0: `cd test ; echo !(file2)'
どんな解決策でも大歓迎です!