谁能解释一下以下4个例子中环境变量范围的不同?
❯❯❯ b=1 echo $b
❯❯❯ b=1; echo $b
1
❯❯❯
❯❯❯ cat gen.sh
#!/bin/bash
echo $a
❯❯❯
❯❯❯ a=1 ./gen.sh
1
❯❯❯ a=1; ./gen.sh
$parameters的扩展是在执行命令之前,利用当前环境进行的。
赋值参数不会自动 出口 的子进程(命令),但只有在随后的 调用 的命令(在其命令行中,根据规则#1)。
但是,"a=b命令 "形式的命令,其赋值会被导出到命令中,但只是暂时的--只适用于该单条命令的调用。
鉴于上述三个规则。
❯ b=1 echo$b
首先被翻译成:b=1 echo ""......并且不打印任何内容。
❯ b=1; echo $b
的工作原理,因为有两个不同的命令,就像它们被放在两个不同的行中一样。第一条是展开并设置一个变量;然后第二条是展开。
#!/bin/bash
echo $a
(这个脚本会打印在环境中找到的$a)。
❯❯ a=1 .gen.sh
这个工作是因为a=1是导出的,所以gen.sh在环境中找到了它。
淘气a=1; .gen.sh
这不可行,因为a=1被设置,但没有导出到子进程;所以gen.sh启动了,但没有在环境中找到$a。而下面的操作则可以。
恶作剧式的导出a=1; .gen.sh