2016-09-28 110 views
0

我有2个脚本:bash脚本输出/源怪异行为

  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 
    

而现在,弄得我...我第一次运行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,但是我不能在第二个脚本中使用它?

回答

2

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

+0

感谢您的解释......但为什么我可以从提示符回显它? – Wolfy

+0

因为“prompt”*是当前shell。 –

+0

Absurdly minor nit。事实证明,“出口”并不一定会将变量转移到环境中。在bash中它确实存在,但通常它只能确保变量将处于所有子进程的环境中。为什么任何shell都会选择以任何其他方式来实现这种行为,而不是简单地把变量放在环境中是令人困惑的,但是'dash'至少选择不这样做。 (或者在我检查过的最后一个版本中,这是几年前。) –