为什么:阻止$ {username =`whoami`}抛出错误?

时间:2014-10-29 16:42:55

标签: bash shell

为什么

${username=`whoami`}

抛出错误,而

: ${username=`whoami`}

执行一项没有任何不良影响的作业?

我理解:是一个占位符。它在这个命令中有什么用?它是否相当于运行: 'whoami'


作为参考,以前的用法以前称为#3,新的用法称为#4。

2 个答案:

答案 0 :(得分:6)

${parameter=value}

执行以下两项操作:如果尚未设置value,则会产生将parameter分配给parameter的副作用,以及扩展到parameter值的直接影响完成后。

错误是直接影响的结果:当你运行

${user=`whoami`}

...在它自己的行上,然后扩展到并尝试运行whoami的输出作为命令。我们先说先前未分配用户变量,whoami的输出为james;然后它会尝试运行命令james,这会引发错误。

相比之下,正在运行

: ${user=`whoami`}

...首先执行副作用(如果尚未设置user,则对user进行分配),然后运行:

: james

...没有效果,因此只执行(分配的)副作用。

答案 1 :(得分:3)

在#3中,根据bash手册页,您正在尝试执行whoami命令输出,即,如果whoami命令输出是“peter”,则#3表示调用“peter”命令。此外,“username”变量被赋值为“peter”

bash手册描述了${parameter:=word}如下:

  

指定默认值。如果参数未设置或为null,则将字的扩展分配给参数。然后替换参数的值。不能以这种方式分配位置参数和特殊参数。

同样,对于:命令 -

  

没有效果;除扩展参数和执行任何指定的重定向之外,该命令不执行任何操作。返回零退出代码。