何时在环境变量和命令之间使用分号


14

谁能解释为什么必须用分号才能使LANGbash更新它?

不起作用:

> LANG=Ja_JP bash -c "echo $LANG"
en_US

作品:

> LANG=Ja_JP ; bash -c "echo $LANG"
Ja_JP

我正在使用Linux上的bash 4.1.10和cygwin下的相同版本

Answers:


23

在执行命令之前读取命令时会执行参数和其他类型的扩展。

第一个版本LANG=Ja_JP bash -c "echo $LANG"是一个命令。这样解析后,$LANG将其扩展en_US为执行任何操作之前的状态。一旦bash完成处理输入,它派生一个过程中,增加了LANG=Ja_JP如预期的环境,然后执行bash -c echo en_US

您可以使用单引号(即LANG=Ja_JP bash -c 'echo $LANG'output)来防止扩展Ja_JP

请注意,当您将变量分配作为命令的一部分时,分配仅影响该命令的环境,而不影响您的Shell的环境。

第二个版本LANG=Ja_JP; bash -c "echo $LANG"实际上是依次执行的两个独立命令。第一个是没有命令的简单变量分配,因此会影响当前的shell。

因此,尽管从表面上区分了一个,但您的两个摘要在根本上是不同的;

完全偏离主题,但我建议您.UTF-8在设置时附加一个LANG。如今,没有充分的理由不在21世纪使用Unicode。


很好的答案-谢谢!关于添加UTF-8。我正在尝试测试需要在多个平台上工作的应用程序的语言环境处理,其中一些平台已经很老了。在这种差异(感谢您已经解释过)与linux和cygwin的差异之间,我将投入总线!
理查德·科登

5

VAR=value; somecommand 相当于

VAR=value
somecommand

这些是不相关的命令,一个接一个地执行。第一个命令为shell变量分配一个值VAR。除非VAR已经是环境变量,否则不会将其导出到环境,否则它将保留在外壳内部。声明export VAR将导出VAR到环境中。

VAR=value somecommand是不同的语法。该分配VAR=value是针对环境的,但是此分配仅在的执行环境中进行somecommand,而不用于后续的Shell执行。

例如:

# Assume neither VAR1 nor VAR2 is in the environment
VAR1=value
echo $VAR1                        # displays "value"
env | grep '^VAR1='               # displays nothing
VAR2=value env | grep '^VAR2='    # displays "VAR2=value"
echo $VAR2                        # displays nothing

我还没有真正考虑过shell与环境变量之间的区别。我得去做一些研究。感谢您的回答。
理查德·科登
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.