Answers:
在执行命令之前,在读取命令时会执行参数和其他类型的扩展。
第一个版本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。
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