测试
a.sh
1 2 3 4 5 |
#!/bin/sh export A=A a=a ./b.sh echo "b is $b" |
b.sh
1 2 3 4 5 |
#!/bin/sh export b=B echo "a is $a" echo "A is $A" sleep 1000 |
1 |
sh a.sh |
1 |
cat /proc/pid_of_a.sh/environ | tr \\0 \\n |
结果: 没有A=A ,也没有 a=a
1 |
cat /proc/pid_of_b.sh/environ | tr \\0 \\n |
结果: 有A=A, 没有 a=a
结论:
- 环境变量和变量是不同的, /proc/pid/environ 中只是“环境”变量,不同变量是不会体现在该文件中的
- export导出的变量,在后续执行的shell进程中可以看到,不导出则看不到
- 尽管b.sh中export了b变量,a.sh中也是看不到的,因为b.sh是一个新的进程
脚本中执行其它脚本的几种方法:
- 如上面a.sh中执行b.sh ,可以理解是a.sh调起了一个新的进程来执行b.sh的
- 在a.sh中如果用source(或 . )来执行 b.sh ,则b.sh中将可以看到A,也可以看到a,因为这样的话b.sh并不是一个新的进程,而是在当前进程中执行的
- 在a.sh 中如果用exec来执行b.sh,则b.sh经在当前进程中执行,但是不同于source的是,b.sh下面的命令将不会被执行,进程将随着b.sh执行的结束而结束