在Shell中,有一种奇怪的现象,当我们在myshell.sh中输入如下代码,保存并退出。
pwd cd .. pwd
运行代码,可以看到如下现象:
脚本执行cd命令,发现回显消息当前所处的目录发生改变,但是实际上,真实目录并没有改变。其实这也很好理解,在上一篇博客中,我们提到了,执行的本质原理是Shell会fork一个子进程来解释脚本。
但是,如果我们直接在命令行执行cd命令,就会发现,父bash的工作目录发生了改变:
这又如何理解呢?
其实,归根结底,执行命令不一定要创建子进程。
不需要创建子进程的命令,叫做Shell的内置命令,由父bash亲自执行。
可是,如果我们就是想通过执行程序的方式来达到这种效果呢?我们就可以用下面这条命令:
此时我们就可以发现,工作目录发生了变化。这就达到了我们想要达到的效果。
source的作用是在当前bash环境下读取并执行FileName中的命令,该FileName文件可以没有“执行权限”。
注:该命令通常用命令 . 来替代。
source或 . 命令是Shell的内建命令,这种方式不会创建子Shell,而是直接在交互式Shell下逐行执行脚本中的命令。