Bash脚本导出/源奇怪的行为

时间:2016-09-28 09:38:32

标签: linux bash shell

我有两个脚本:

  1. 脚本: 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"
    
  2. 脚本: script2.sh

    #!/bin/bash
    echo "--- $I"
    if [ -z $I ]; then
            echo "VARIABLE NOT SET"
    else
            echo "VARIABLE SET"
    fi
    
  3. 现在让我困惑的部分......我先运行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,但我不能在第二个脚本中使用它吗?

1 个答案:

答案 0 :(得分:2)

因为你没有导出它。导出变量会将其从当前shell的变量列表移动到环境中。子流程只读取环境中的现有变量。