我有 2 个脚本:
脚本: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
并像以前一样重新运行这两个脚本(在重新运行之前我创建了一个新 session 以便重置所有变量)
在这种情况下,我可以在 script2 中读取 $I 并回显它
wolfy@VMtest:~$ . ./script1.sh
some string:
--- asd
wolfy@VMtest:~$ ./script2.sh
--- asd
VARIABLE SET
wolfy@VMtest:~$ echo $I
asd
有人能解释一下为什么在我的第一个场景中我可以回显 $I,但我不能在第二个脚本中使用它吗?
最佳答案
因为你没有导出它。导出变量会将其从当前 shell 的变量列表移至环境中。子进程仅从环境中读取现有变量。
关于linux - Bash 脚本导出/来源奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39743591/