bash 手册中说“任何简单命令或函数的环境都可以通过在其前面加上参数赋值来临时增强”。我还知道导出变量默认传递给 bash 创建的子进程。我正在测试一些非导出变量的行为,我不明白的是,当赋值后跟运算符“;”时,它是如何工作的,然后执行一些其他命令。
我的情况如下:
VAR=hello; echo $VAR
打印“你好”。
VAR=hello :; echo $VAR
打印换行符。
VAR=hello; echo $VAR; bash -c 'echo $VAR'
打印“hello”和一个换行符。
问题是,在第一个和第三个命令中,为什么要扩展 VAR?它们是不同的命令,(显然)没有前缀参数分配。
PS:我已在 bash 4.4.20 和 5.1.16 中尝试过,两者的行为相同。
看起来您基本上是在询问有关导出以及何时需要导出的内容。让我们看看您的每个示例:
VAR=hello; echo $VAR
:这是两个命令,在同一个 shell 会话中运行。由于我们在同一个会话中,所以第一个变量赋值就足够了,不需要做export
任何事情。VAR=hello :; echo $VAR
:这里我们在同一个 shell 会话中也有两个命令,但在这种情况下,变量仅在:
命令的持续时间内明确设置。所以在这里,您实际上并没有在 shell 会话中设置变量,您只为该命令设置了它。所以当您回到 shell 时,变量未设置,因此 echo 会打印一个空行。VAR=hello; echo $VAR; bash -c 'echo $VAR'
:这里我们有一个 shell 会话,您在其中运行VAR=hello
和echo $VAR
。然后您启动一个新的 shell 会话,因此它不会继承未导出的变量,并且在第二个会话中,echo $VAR
不打印任何内容。这就是导出会产生影响的地方:尽管如评论中指出的那样,
:
是一个“特殊内置”,因此根据 POSIX, 中的赋值VAR=hello :
应该在 shell 环境中可见。但是 Bash 在正常模式下不会这样做,但在POSIX 模式下会这样做,其他 POSIX shell 也几乎都会这样做。在 POSIX 模式 bash ( )、dash 或 ksh中
unset VAR; VAR=hello :; echo "$VAR"
打印也是如此。如果使用 eg而不是,情况会有所不同,因为它只是一个常规命令(无论是否内置)。hello
bash -o posix
true
: