这段时间在看《Shell十三问》这篇文章,看到了一个问题,让我迷惑了一天,晚上终于搞懂了,就把它记下来,供大家参考参考。
在文章中讲到:cd /a/b/c (/a/b/c为假设的路径名),通过命令行的形式,可以改变当前的路径。但当把这条命令写入一个脚本中,然后运行脚本,但不能改变当前的路径。why?
《Shell十三问》的作者是这么解释的:运行脚本的的流程是:在当前Shell中产生一个子Shell的进程,然后在子Shell进程中产生命令行的子进程,完成所有命令行的解释,则返回父进程。因为环境变量传递是单向的(只能从父进程传递给子进程,其实就可以理解为“遗传”)。所以在子进程中改变的环境变量,在父进程中是无效的(是不能逆传递的,就像你father有些特征是不可能“遗传”到son的,那如果真的是,那关系就复杂了)。作者在书中开始讲到:我们在 shell 所下达的命令,均是 shell 所产生的子行程。当时我就想,我们在命令行中用cd命令不也是产生一个子进程吗?为什么它就能改变环境变量了?
通过网上查了一些资料,终于明白了:作者说的那句话:我们在 shell 所下达的命令,均是 shell 所产生的子行程。太笼统了。在Shell中有些命令是不产生子进程的,那就是Shell的内建命令,cd这个命令就是内建命令,所以运行cd命令就是在当前的shell中,所以就能改变环境变量PWD。
好了,说了这么多,不知道大家明白没有?
顺便说一下,可以通过type这个命令查看shell命令的类型,就可以区分哪些命令是内建命令,哪些是外部命令。
阅读(1865) | 评论(1) | 转发(0) |