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

标签 linux bash shell

我有 2 个脚本:

  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……

第一种情况:

如您所见,我可以在 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/

相关文章:

linux - 如何从日志文件中打印多行,并将它们转换为单行

c++ - 控制用户界面的最佳方式

bash - 我们可以通过 AWS SSM 将命令作为后台进程运行吗?

linux - Bash 在 CSV 列中选择多个值

android - 如何通过您的应用程序运行 traceroute 命令?

bash - 如何在vim中直观地选择,然后直接执行shell命令?

bash - 在shell的一行中运行多个命令

arrays - 将命令的输出与 bash 中的数组相匹配

linux - 为什么linux shell中带大括号的 `{cat,filename}` Group命令可以运行?

linux - 如何/在哪里找到要修复的 Linux 内核错误?