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

 2023-09-06 阅读 24 评论 0

摘要:本文主要用来区别一下几个命令【其实要真正的区别这些概念还应该深入讨论进程的相关知识,这里暂且不表,待续~】 shell subshell source $(commond) ` commond` exec linux执行Scripts有两种方式,主要区别在于是否建立subshell 1.s

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

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 环境。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/6972.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息