先上sh02.sh内容(内容来自《鸟哥的Linux私房菜基础学习篇》)。
<span style="font-size:18px;">#!/bin/bash
#Program:
# User inputs his first name and lastname. Program shows his full name.
#History
#2016/09/26 first release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
read -p "Please input your first name:" firstname
read -p "Plaese input your last name: " lastname
echo -e "\nyour full name is:$firstname $lastname"
#exit 0
</span>
分别使用source sh02.sh
./sh02.sh
sh sh02.sh运行脚本文件。发现结果如下图:
也就是说,使用source sh02.sh 运行时,变量的值使可以继续在当前的进程中得到的。而使用另外两种命令运行的话,不会改变这个变量的值。(记得测试的时候需要用不同的字符串测试,不然很容易误解的,不要问我怎么知道的~~)
事实上,如果最先运行的不是 source sh02.sh的话,那个echo $firstname的结果什么都没有。
书上的解释是,sh sh02.sh和./sh02.sh运行的时候,其实script是在子进程的bash内执行的,当子进程完成后,子进程的各项变量或者操作将会结束而不会传回到父进程中。
source sh02.sh运行时,是在父进程中运行的。
另外,还有一个不同的地方是exit 0的效果。
书上的案例,在这里是没有exit 0的,但是我因为偷懒就把之前sh01.sh的内容直接copy过来,所以exit 0开始还有。下面说说有exit 0 的时候的结果:
source sh02.sh运行结束之后,终端会关掉。
sh sh02.sh和./sh02.sh运行结果完全和没有exit 0 的结果相同。
显然,这个结果,也很好地验证了上面的那个关于父进程和子进程的结论。