我有两个脚本:
脚本: 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 ......
第一种情况:
如您所见,我可以在script1中打印$ I变量(值:asd)。当我运行script2时,它返回" VARIABLE NOT SET",但是当我尝试回显$ I时,我得到" asd"
wolfy@VMtest:~$ . ./script1.sh
some string:
--- asd
wolfy@VMtest:~$ ./script2.sh
---
VARIABLE NOT SET
wolfy@VMtest:~$ echo $I
asd
wolfy@VMtest:~$
第二种情况:
现在我取消注释#export I
并像以前一样重新运行这两个脚本(在重新运行之前我创建了一个新会话,以便重置所有变量)
在这种情况下,我可以在script2中读取$ I并回显它
wolfy@VMtest:~$ . ./script1.sh
some string:
--- asd
wolfy@VMtest:~$ ./script2.sh
--- asd
VARIABLE SET
wolfy@VMtest:~$ echo $I
asd
有人可以解释一下为什么在我的第一个场景中我可以回复$ I,但我不能在第二个脚本中使用它吗?
答案 0 :(得分:2)
因为你没有导出它。导出变量会将其从当前shell的变量列表移动到环境中。子流程只读取环境中的现有变量。