您的位置:首页 > 运维架构 > Shell

shell与subshell与执行脚本的几种方式

2016-09-05 20:36 225 查看
本文主要用来区别一下几个命令【其实要真正的区别这些概念还应该深入讨论进程的相关知识,这里暂且不表,待续~】

shell

subshell

source

$(commond)

` commond`

exec

linux执行Scripts有两种方式,主要区别在于是否建立subshell

1.source filename OR . filename

不创建subshell,在当前shell环境下读取并执行filename中的命令,就相当于顺序执行filename里面的命令

2.bash filename OR ./filename

创建subshell,此命令是在当前bash环境下再新建一个子shell执行filename中的命令

子shell继承fushell的变量,但子shell不会改变父shell的变量,除非使用export【注释:有没有想过,这和命名空间是相似的道理,甚至和c中的函数也有些类似】

子Shell能够从父Shell继承得来的属性如下:

当前工作目录

环境变量

标准输入、标准输出和标准错误输出

所有已打开的文件标识符

忽略的信号

子Shell不能从父Shell继承得来的属性,归纳如下:

除了环境变量和.bashrc文件中定义变量之外的Shell变量

未被忽略的信号处理

$(commond)

这个的作用是让命令在子shell中执行

` commond`

也是用来执行命令和,$()差不多

exec commond

它替换了当前的shell却没有创建一个新的进程。进程的pid保持不变, it replaces the shell without creating a new process【如果想了解透彻应该去看c的进程】

那么它的作用是什么???

shell的内建命令exec将并不启动新的shell,而是用要被执行命令替换当前的shell进程,并且将老进程的环境清理掉,而且exec命令后的其它命令将不再执行。

因此,如果你在一个shell里面,执行exec ls那么,当列出了当前目录后,这个shell就自己退出了,因为这个shell进程已被替换为仅仅执行ls命令的一个进程,执行结束自然也就退出了。为了避免这个影响我们的使用,一般将exec命令放到一个shell脚本里面,用主脚本调用这个脚本,调用点处可以用bash a.sh,(a.sh就是存放该命令的脚本),这样会为a.sh建立一个sub shell去执行,当执行到exec后,该子脚本进程就被替换成了相应的exec的命令。

exec 命令:常用来替代当前 shell 并重新启动一个 shell,换句话说,并没有启动子 shell。使用这个命令的时候,放在内存中的变量恐怕就要被清除了。但exec 在对文件描述符进行操作的时候,也只有在这时,exec 不会覆盖你当前的 shell 环境。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shell subshell