linux脚本中父shell与子shell 执行的几种方式

本文主要介绍如下几个命令的区别:linux

shell
subshell
source
$ (commond)
`commond`
Linux执行Scripts有两种方式,主要区别在因而否创建subshellshell

1. source filename or . filenamebash

不建立subshell,在当前shell环境下读取并执行filename中的命令,至关于顺序执行filename里面的命令函数

2. bash filename or ./filename继承

建立subshell,在当前bash环境下再新建一个子shell执行filename中的命令
子shell继承父shell的变量,但子shell不能使用父shell的变量,除非使用export
【备注:这和命名空间是类似的道理,甚至和c中的函数也有些相似】进程

子Shell从父Shell继承得来的属性以下:ip

当前工做目录
环境变量
标准输入、标准输出和标准错误输出
全部已打开的文件标识符
忽略的信号
子Shell不能从父Shell继承的属性,概括以下:get

除环境变量和.bashrc文件中定义变量以外的Shell变量
未被忽略的信号处理变量

3. $ (commond)file

它的做用是让命令在子shell中执行

4. `commond`

和$(commond)差很少。
【这里的“ ` ”符号是撇(反单引号),不是单引号,是键盘上Esc按键下面的那个键。】

5. exec commond

替换当前的shell却没有建立一个新的进程。进程的pid保持不变 做用: shell的内建命令exec将并不启动新的shell,而是用要被执行命令替换当前的shell进程,而且将老进程的环境清理掉,并且exec命令后的其它命令将再也不执行。 当在一个shell里面执行exec ls后,会列出了当前目录,而后这个shell就本身退出了。(后续命令再也不执行) 由于这个shell已被替换为仅执行ls命令的进程,执行结束天然也就退出了。 须要的时候能够用sub shell 避免这个影响,通常将exec命令放到一个shell脚本里面,用主脚本调用这个脚本,调用点处能够用bash a.sh(a.sh就是存放该命令的脚本),这样会为a.sh创建一个sub shell去执行,当执行到exec后,该子脚本进程就被替换成了相应的exec的命令。

相关文章
相关标签/搜索