在Linux终端(zsh shell)上'和`之间的区别

时间:2018-11-23 22:08:10

标签: shell zsh

在zsh shell脚本上设置变量时,使用'和`会导致不同的结果-

>>>one=`echo test`
>>>$one
>>>
>>>two='echo test'
>>>$two
>>>zsh: command not found: echo test

两者的功能是什么?

1 个答案:

答案 0 :(得分:1)

这并不像看起来那样简单。这是对正在发生的事情的解释。根据外壳程序(和版本),诸如IFS之类的变量以及至少包括别名的其他可能性,以下任何或全部内容可能均不适用,但我认为在正常情况下这是一种合理的思考方式。由于我比Zsh更熟悉Bash,因此我包括了Bash引用,但是所有这些应该都适用于Zsh和其他类似POSIX的shell。

让我们逐行解构这些

one=`echo test`

  1. 由于该行以有效的变量名开头,后跟等号,因此它是变量赋值,因此首先处理右侧。
  2. `echo test`command substitution。 (在现代Shell中,此格式为discouraged,而$(echo test)则为{。}。)按以下方式处理:
    1. 反引号(echo test)中的字符串word split分为“ echo”和“ test”。
    2. 由命令“ echo”组成的命令被执行,并且参数列表由单个项“ test”组成。这是一个兔子洞,我不知道细节,所以我什至不会尝试解释实际执行此命令会发生什么。我认为这与execve有关吗?
      1. 该命令的标准错误(在这种情况下为空)照常发送到终端。
      2. 命令的
      3. 标准输出(在这种情况下和此顺序下,对应于Basic Latin字符“ t”,“ e”,“ s”,“ t”和然后newline)被换行的右切,最后是字节0x74、0x65、0x73和0x74。
  3. 上面的字节被分配给变量one

$one

  1. 这是变量替换。上面的字节代替了变量,并将结果字符串视为命令。
  2. test确实是一个命令(很有可能也是zsh的内置命令),因此它运行良好并返回退出代码1,因为没有参数。有关详细说明,请参见help testman test

two='echo test'

  1. 与其他分配相同,除了右侧是单个quoted字符串。这意味着两个apostrophes之间的全部内容被视为单个文字字符串,并且其中没有分词。
  2. 与字符串“回声测试”相对应的结果字节集被分配给变量two

$two

  1. 与其他变量扩展一样,整个字符串被视为命令,因为在执行该命令之前不会发生词拆分。确实可以创建命令“回声测试”(例如,使用ln -s /bin/echo '/bin/echo test'
  2. 由于该命令在您的系统上(以及实际上在任何其他理智的* nix系统上均不存在),因此zsh会帮助您打印一条错误消息。
相关问题