为什么 URL 中的“&”符号会导致 Mac OS X 终端中的某些命令失败?

为什么 URL 中的“&”符号会导致 Mac OS X 终端中的某些命令失败?

为什么 URL 中的 & 符号会导致以下命令失败?

我想通过在终端中运行 Safari 来打开网页,并将 URL 作为参数。

这按预期工作:

open -a safari "http://endic.naver.com/search.nhn?sLn=en&searchOption=all&query=good"

但是一旦删除引号,它就不会按预期工作:

open -a safari http://endic.naver.com/search.nhn?sLn=en&searchOption=all&query=good

相反,它返回:

[3] 5395
[4] 5396
[1]   Done                    open -a safari http://endic.naver.com/search.nhn?sLn=en
[2]   Done                    searchOption=all

似乎 URL 中的 “&” 符号被视为“在后台运行上一个命令”,尽管 URL 中的 “&” 符号后面没有空格。

答案1

“与”号是命令分隔符(类似于分号;),但表示该命令将在后台运行。

如果命令以控制操作符 & 结束,则 shell 会在子 shell 中在后台执行该命令。shell 不会等待命令完成,返回状态为 0。以 ; 分隔的命令按顺序执行;shell 会依次等待每个命令终止。返回状态是最后执行的命令的退出状态

因此你运行了三个命令:

  • open -a safari "http://endic.naver.com/search.nhn?sLn=en在背景中
  • searchOption=all在背景中
  • query=good在前景中

后两个只是变量赋值,因此没有显示错误(当意外发生这种情况时通常会出现这种情况)。


尽管 URL 中的 “&” 符号后面没有空格。

&这对于或;结束命令都不是必需的:

$ ls;pwd
Applications Desktop      Documents    Downloads    Library      Movies       Music
Pictures     Projects     Public       Work
/Users/danielbeck

相关内容