为什么“A = 10 echo $ A”不打印10?

Modified on: Thu, 14 Jun 2018 04:23:23 +0800

此命令:

A=10 echo $A

打印一个空行。为什么不10?为什么就地临时环境设置不起作用?

我想知道原因和解释而不是解决方案。

我用过

LANG=C gcc ...

强制gcc使用后备语言(英语)而不是系统语言(中文)。所以我假设VAR=value前缀将为其后的命令设置临时环境。但看起来我有一些误解。

最佳答案

这是评估命令的不同步骤的顺序问题。

A=10 echo $A首先将命令解析为由三个字A=10echo$A。然后每个单词都经过变量替换,即将变量扩展(如$A)转换为它们的值(我省略了不可见的步骤)。

如果A最初的值为foo,则扩展步骤的结果是一个简单的命令,它仍然有三个单词:A=10echofoo。 (此时shell还会记住哪些字符最初在引号内 - 在本例中为none。)下一步是执行命令。由于A=10以有效的变量名开头,后跟等号,因此将其视为赋值;在执行命令期间,shell和环境中的变量A都设置为10。 (通常你需要编写export A以在环境中拥有A而不仅仅是一个shell变量;这是一个例外。)下一个单词不是赋值,所以它被视为命令名(它是一个内置命令)。 echo命令不依赖于任何变量,因此A=10 echo $Aecho $A具有完全相同的效果。

如果要仅在命令的持续时间内设置变量,但在执行命令时考虑分配,则可以使用子shell。子括号表示的子shell使子shell的所有状态更改(变量赋值,当前目录,函数定义等)本地化。

(A=10; echo $A)

如果要将变量导出到环境中,以便外部程序可以看到它,请将export A=10

作者:Gilles

相关问答

添加新评论