わかった。これが何が起こっているのかです。
これはcalcとは何の関係もなく、bashとはすべて関係があります。これを説明するために、最初にエコーを使用した例を示します。
wlynch@host:/tmp/blah$ ls # No files in this directory
wlynch@host:/tmp/blah$ echo *(3) # This works as you expect.
*(3) #
wlynch@host:/tmp/blah$ echo *(4) # This works as you expect.
*(4) #
wlynch@host:/tmp/blah$ touch 3 # Create a file named 3 in the directory.
wlynch@host:/tmp/blah$ ls #
3 #
wlynch@host:/tmp/blah$ echo *(3) # This now gives a different result!
3 #
wlynch@host:/tmp/blah$ echo '*(3)' # Quoting gives what you want.
*(3) #
wlynch@host:/tmp/blah$ echo *(4) # This works as you previously expected.
*(4)
。という名前のディレクトリにファイルを作成すると、出力が変更されていることに注意してください3
。
ここで起こっているの*(pattern)
は、ワイルドカードです。含まれているパターンの任意の数と一致します。Bashには奇妙な副作用もあります。パターンが一致しない場合、何も返さずに、元のパターンを返します。
したがって、あなたの場合、誤ってbashのワイルドカード置換方法の1つを使用しています。パターンマッチング。
さて、なぜ/()
失敗するのですか?これは、括弧がbashの別のコマンドであり、これがたまたま構文エラーとして使用されているためです。グループ化コマンド。
他の回答で述べたように、解決策は、コマンドライン引数を引用符で囲み、これらの機能のいずれも有効にしないようにすることです。
また、余談ですが、を使用する機能を無効にすることができ*(pattern)
ます。これを行うと、括弧のために/()
との両方*()
が失敗します()
:
wlynch@host:/tmp/blah$ shopt -s extglob
wlynch@host:/tmp/blah$ echo *()
*()
wlynch@host:/tmp/blah$ echo /()
bash: syntax error near unexpected token `('
wlynch@host:/tmp/blah$ shopt -u extglob
wlynch@host:/tmp/blah$ echo *()
bash: syntax error near unexpected token `('
wlynch@host:/tmp/blah$ echo /()
bash: syntax error near unexpected token `('