好的。这是正在发生的事情。
这与 calc 无关,与 bash 有关。为了解释这一点,我先举一个 echo 的例子。
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 的通配符替换方法之一。模式匹配。
现在,至于为什么会/()
失败?那是因为括号是 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 `('