Ric*_*den 16 bash shell-script
谁能解释为什么分号是必要的,以便LANGbash 将其视为更新?
不起作用:
> LANG=Ja_JP bash -c "echo $LANG"
en_US
Run Code Online (Sandbox Code Playgroud)
作品:
> LANG=Ja_JP ; bash -c "echo $LANG"
Ja_JP
Run Code Online (Sandbox Code Playgroud)
我正在 linux 上使用 bash 4.1.10 和在 cygwin 下使用相同版本
jw0*_*013 26
参数和其他类型的扩展在读取命令时执行,然后再执行。
第一个版本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'输出Ja_JP。
请注意,当您将变量赋值作为命令的一部分时,赋值只会影响该命令的环境,而不会影响您的 shell 的环境。
第二个版本,LANG=Ja_JP; bash -c "echo $LANG"实际上是两个单独的命令依次执行。第一个是没有命令的简单变量赋值,因此它会影响您当前的 shell。
因此,尽管单个;.
完全偏离主题,但我是否建议.UTF-8在设置LANG. 现在没有充分的理由在 21 世纪不使用 Unicode。
VAR=value; somecommand 相当于
VAR=value
somecommand
Run Code Online (Sandbox Code Playgroud)
这些是一个接一个执行的无关命令。第一个命令为 shell 变量赋值VAR。除非VAR已经是环境变量,否则它不会导出到环境中,它保留在 shell 内部。语句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
Run Code Online (Sandbox Code Playgroud)