shell脚本学习第二弹-神奇的cd

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等等。命令行在执行外部命令时,会创建一个进程,在执行过程中,就有了进程的创建和消亡。我们细细说明一下这个过程:(很重要)

  1. 创建一盒shell进程的子进程
  2. 在子进程中查找外部命令在文件中的位置
  3. 在子进程中,用新程序取代shell拷贝并执行相应的程序,父进程进入休眠状态,等待子进程完毕。
  4. 子进程销毁,返回
    我们会发现,在这个过程中,父进程的属性(也就是环境变量)没有改变,因为子进程没办法改变父进程的环境变量。

有了上面的基础,我们就只到为什么脚本中cd在当前命令行是无效的了。那么,想要他有效,还有一种办法,就是用source来执行。

source cd.sh
#或者 
. cd.sh 

source命令是直接可以改变环境变量的,运行在父进程上的,所以没有进程的销毁和创建的。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容