在运行命令之前设置环境变量时,`;` 和空格有什么区别

在运行命令之前设置环境变量时,`;` 和空格有什么区别

我一直在想这两者之间有什么区别:

  • CAROOT='certificates'; echo $CAROOT- 打印值,用作;两个命令之间的分隔符
  • CAROOT='certificates' echo $CAROOT- 打印空值。

我想知道为什么前一个命令有效而后一个命令无效?

答案1

以下命令行及其输出可以帮助解释其工作原理。

$ LANG=C bash -c 'echo LANG=$LANG'; echo LANG=$LANG
LANG=C
LANG=sv_SE.UTF-8

LANG=C仅有空格仅对以下命令起作用,之后将再次使用旧的 LANG 设置。

但是为什么在第二种情况下会打印一个空值?我会这样解释:变量将直接由 shell 扩展。这与 的情况不同bash -c 'echo LANG=$LANG',在 中,变量最初受 [引号] 保护,稍后在处理完前一个变量设置命令后才会扩展。


当您想要暂时更改语言时,通常使用仅使用空格而没有分号的方法,如下面的示例所示,标题更改为标准语言(英语)。

$ df -h
Filsystem      Storlek Använt Ledigt Anv% Monterat på
udev               16G      0    16G   0% /dev
tmpfs             3,2G   1,6M   3,2G   1% /run
/dev/sda5          88G    32G    52G  39% /
tmpfs              16G      0    16G   0% /dev/shm
tmpfs             5,0M   4,0K   5,0M   1% /run/lock
tmpfs              16G      0    16G   0% /sys/fs/cgroup
/dev/sdb7         3,5T   998G   2,4T  30% /media/multimed-2
tmpfs             3,2G    20K   3,2G   1% /run/user/1000

$ LANG=C df -h
Filesystem      Size  Used Avail Use% Mounted on
udev             16G     0   16G   0% /dev
tmpfs           3,2G  1,6M  3,2G   1% /run
/dev/sda5        88G   32G   52G  39% /
tmpfs            16G     0   16G   0% /dev/shm
tmpfs           5,0M  4,0K  5,0M   1% /run/lock
tmpfs            16G     0   16G   0% /sys/fs/cgroup
/dev/sdb7       3,5T  998G  2,4T  30% /media/multimed-2
tmpfs           3,2G   20K  3,2G   1% /run/user/1000

相关内容