shell脚本引用子脚本中的变量

废话少说! show me the fucking source code!

// 目录结构
.
├── config.sh
└── main.sh

场景1: main脚本引用子脚本中的变量

# config.sh
export NAME1="name1 in config";
NAME2="name2 in config";

# !/bin/bash
# main.sh

# 这样无法引用到config.sh中的变量
./config.sh
echo "name3 = ${NAME1}";
echo "name4 = ${NAME2}";

# 这样也无法引用到config.sh中的变量
sh ./config.sh
echo "name3 = ${NAME1}";
echo "name4 = ${NAME2}";

# 这样就可以引用到config.sh中的变量
source ./config.sh
echo "name3 = ${NAME1}";
echo "name4 = ${NAME2}";

# 通过分析./config.sh还是 sh config.sh作用是一样的,都是新开启了一个shell进行,去执行config.sh
# 而接下来的echo语句是在主shell进程执行的。
# 可以通过 echo $$来打印当前shell执行的pid。

场景2: 子脚本引用主脚本中的变量



# config.sh
echo "NAME3 = ${NAME3}";
echo "NAME4 = ${NAME4}";
# main.sh
export NAME3="name3 in main.sh";
NAME4="name4 in main.sh";

# 这种方式,config.sh只能引用到NAME3,而引用不到NAME4
# 因为NAME3是export出去的。
./config.sh
# 这种方式同样,config.sh只能引用到NAME3,而引用不到NAME4
# 因为NAME3是export出去的。
sh config.sh

# 这种方式对于config.sh来说,NAM3和NAME4都可以引用到
source config.sh

总结: source xxx.sh相当拷贝了一份xxx.sh中的代码到本脚本中,执行过程都是在同一个进程中完成的。而./xxx.sh和 sh xxx.sh都是新fork了一个新的shell进程去执行。而export的作用域是本进程以及本进程的子进程,但是export对于父进程无效。