0
我有2个脚本:bash脚本输出/源怪异行为
脚本:script1.sh
#!/bin/bash [[ $0 = "$BASH_SOURCE" ]] && { echo "You must source me!"; exit; } if [ -z ${I} ]; then echo echo -n "some string: " stty -echo read I #export I stty echo echo else echo "ALREADY SET!!!" fi echo "--- $I"
脚本:script2.sh
#!/bin/bash echo "--- $I" if [ -z $I ]; then echo "VARIABLE NOT SET" else echo "VARIABLE SET" fi
而现在,弄得我...我第一次运行SCRIPT1然后SCRIPT2部分...
第一种方案:
正如你可以看到我可以打印$ I变量(值:ASD)内部脚本1。当我运行SCRIPT2它返回“变量未设置”,但是当我尝试回声$ II获得“ASD”
[email protected]:~$ . ./script1.sh
some string:
--- asd
[email protected]:~$ ./script2.sh
---
VARIABLE NOT SET
[email protected]:~$ echo $I
asd
[email protected]:~$
第二种情况:
现在我去掉#export I
并重新运行这两个脚本作为前(重新运行之前,我创建了一个新的会话,以便所有变量将重设)
在这种情况下,我可以读$我在SCRIPT2和回声它
[email protected]:~$ . ./script1.sh
some string:
--- asd
[email protected]:~$ ./script2.sh
--- asd
VARIABLE SET
[email protected]:~$ echo $I
asd
有人可以解释我为什么在我的第一个场景中可以回显$ I,但是我不能在第二个脚本中使用它?
感谢您的解释......但为什么我可以从提示符回显它? – Wolfy
因为“prompt”*是当前shell。 –
Absurdly minor nit。事实证明,“出口”并不一定会将变量转移到环境中。在bash中它确实存在,但通常它只能确保变量将处于所有子进程的环境中。为什么任何shell都会选择以任何其他方式来实现这种行为,而不是简单地把变量放在环境中是令人困惑的,但是'dash'至少选择不这样做。 (或者在我检查过的最后一个版本中,这是几年前。) –