命令替换中的变量赋值

时间:2018-03-23 15:28:20

标签: bash

假设我将一个命令输出一个变量赋值字符串,比如'var = foo',如果我把这个命令放在命令替换中,看起来像   $(echo var=foo) ,会导致“找不到命令”错误。

[223212 dot@anne ~]$ var=foo
[223226 dot@anne ~]$
[223230 dot@anne ~]$ $(var=foo)
[223235 dot@anne ~]$
[223236 dot@anne ~]$ $(echo var=foo)
bash: var=foo: command not found
[223240 dot@anne ~]$
[224909 dot@anne ~]$ $(echo ls)
a    b    c   d    
[225036 dot@anne ~]$
[225110 dot@anne ~]$ $(echo $(var=foo))
[225116 dot@anne ~]$

因为我们可以直接将变量赋值放在命令替换中,就像这样 $(var=foo) (虽然我认为它没有意义),而 $(echo ls) 可以作为预期,为什么在命令替换中输出一个赋值错误?

这是关于命令替换的man bash

  

命令替换允许输出命令来替换   命令名称。

     

Bash通过在a中执行命令来执行扩展   subshel​​l环境并用。替换命令替换   命令的标准输出,删除任何尾随换行符。

据我了解, $(echo var=foo) 应替换为 var=foo ,就像 $(var=foo) 一样

我弄错了吗?

1 个答案:

答案 0 :(得分:5)

此处man bash

SIMPLE COMMAND EXPANSION
   When a simple command is executed, the shell performs the fol‐
   lowing expansions, assignments, and redirections, from left to
   right.

   1.     The  words  that  the  parser  has  marked  as variable
          assignments (those  preceding  the  command  name)  and
          redirections are saved for later processing.

   2.     The words that are not variable assignments or redirec‐
          tions are expanded.  If any words remain  after  expan‐
          sion,  the  first  word  is taken to be the name of the
          command and the remaining words are the arguments.
   [...]

在您的情况下,简单命令只有一个单词$(echo var=foo)

由于没有标记为变量赋值的单词(因为这个单词是命令替换),所以步骤1不适用。

然后我们继续执行第2步,将$(echo var=foo)一词扩展为var=foo。我们不会回到第一步,我们只是执行第2步所说的:"将第一个单词作为命令的名称"。

这就是var=foo作为命令执行而不是被解释为赋值的原因。