shell脚本学习第二弹-神奇的cd
前言:作为一个linux程序员,估计用的最多的命令就是cd了吧,我们试着用脚本编译一下:
1 #!/bin/bash
2 pwd
3
4 cd /home
5 pwd
我们看一下结果:
/data/shell
/home
但是我们本地的shell中执行pwd:
/data/shell
咦!!!什么鬼??
相信这个问题大家也有人遇到过,我们就从原理上一一深入理解,解决问题。
我们首先看看shell命令的种类:
1.内建命令,顾名思意,就是shell内部包含的命令,就比如我们的cd命令就是一种,它改变了shell的属性设置,内建命令在执行的时候没有进程的创建和销毁。
2.shell函数编写的程序代码,也就是我们要学习的shell脚本。
3.外部命令。这个是我们的主角,他是独立于shell的可执行程序,比如find等等。命令行在执行外部命令时,会创建一个进程,在执行过程中,就有了进程的创建和消亡。我们细细说明一下这个过程:(很重要)
- 创建一盒shell进程的子进程
- 在子进程中查找外部命令在文件中的位置
- 在子进程中,用新程序取代shell拷贝并执行相应的程序,父进程进入休眠状态,等待子进程完毕。
- 子进程销毁,返回
我们会发现,在这个过程中,父进程的属性(也就是环境变量)没有改变,因为子进程没办法改变父进程的环境变量。
有了上面的基础,我们就只到为什么脚本中cd在当前命令行是无效的了。那么,想要他有效,还有一种办法,就是用source来执行。
source cd.sh
#或者
. cd.sh
source命令是直接可以改变环境变量的,运行在父进程上的,所以没有进程的销毁和创建的。