shell运行回车不出结果_Linux编程 9 (shell类型,shell父子关系,子shell用法)

76588d19344e4b8183cb8d40c39995dd

一. shell类型

1.1 交互式 bin/ shell程序

当用户登录到某个虚拟控制台终端或是在GUI中启动终端仿真器时,默认的shell程序就会开始运行。系统启动什么样的shell程序取决于你个人的用户ID配置,在etc/passwd文件中。如下图所示,root用户使用bash shell作为自己的默认shell程序。

68e8e1aae4284f2fad5fc2eb03557a01

bash shell程序位于/bin目录下,使用长列表可以看出它是一个可执行程序:

c1716676ff8447f59694c839f074fc59

像/bin/tcsh 或/bin/dash 或/bin/csh 这些都是shell程序。在我centos 7中没有找到,由于bash shell 使用者最多,很少有人使用其它shell作为默认shell。

1.2 系统 bin/sh程序

除了bash/shell程序还有另外一个默认的shell是/bin/sh。它作为默认的系统shell,用于那些需要在启动时使用的系统shell脚本。在centos 系统中可以看到,使用软链接将默认的系统shell设置成bash shell。这样说来,sh其实就是bash程序。

5d513049ca81406e83b3667ceff302e7

但注意的是有些发行版系统上,默认的系统shell和默认的交互shell并不相同。例如在Ubuntu发行版中。最后并不是必须一直使用默认的交互shell,可以使用发行版中所有可用的shell。可以直接输入命令/bin/dash来启动dash shell。具体就不在演示。

二. shell的父子关系 

2.1 创建子shell

上面说的默认bash shell, 是一个父shell。之前所有章节中所用的交互式shell 都是用的父shell。要创建一个子shell程序很简单,输入bash就会创建一个新的shell程序,被称为子shell。要区分是父shell还是子shell,需要使用前面所学的ps 查看进程命令。

在root用户下,先看没有子shell的父shell进程,如下图所示:

1c17e6f2e0ee4ae688fd6a1de74f6915

接下来,输入bash,来创建一个子shell, 该子shell的PPID父进程是1748, 对应-bash进程的(PID) 1748。

0867aadd30de471d8cc808f5751cefc4

2.2 子shell创建shell

 上面创建的子shell进程为4136。子shell也可以创建一个子shell,子shell再创建子shell。它们的关系如下图所示:

9f85802c32824d93b7610c93a034dc39

下面来演示下这个关系图的shell创建和它们之前的关系层次。下图中又创建了二个子shell,总共三个子shell。依次是子shell, 孙shell, 曾孙shell。

92be066f79fc4f57bd4736215323d965

下图使用ps -f命令也能够通过PPID列出谁是谁的父进程。

95e4cf6ca0f9489aaaf909ce1419ee2b

注意:生成子shell的成本不低,而且速度还慢,创建嵌套的子shell去处理命令进程性能更为严重。

 2.3 退出子shell

通过输入exit命令能有条不絮的退出子shell,例如上面的三个子shell, 首先从曾孙shell退出, 如下图所示:

0653af965d5246eab80f5ce77c7b8749

当没有了子shell时,再输入exit将退出控制台终端。

三. 其它子shell的用法

 3.1 进程列表子shell

在shell中,将命令放入括号中,并在命令列表尾部加分号(;)。这样便会创建出一个子线程去执行。是否生成了子shell,需要借助echo $BASH_SUBSHELL,如果该命令返回0,表示没有子shell。 如下图所示:一组命令放入括号中,产生了一个子shell去执行的。

3a513cfd747d4f0ebe2f2ace53412383

上面说了用命令列表放入括号中,就会创建一个子shell,下面在括号中再套一个括号, 结果是在子shell上创建了子shell。

02652a13a75c483ebd4d61c9fd78ee40

在shell脚本中,经常会使用子shell进行多进程处理。但采用子shell明显拖慢处理速度。因为它并非真正的多进程处理,因为终端控制着子shell的I/O。

3.2 后台模式子shell

在交互式shell中,一个高效的子shell用法就是使用后台模式,在后台模式中运行命令在处理命令的同时让出CLI,以供他用。 演示后台模式经典命令就是sleep。想要将命令置入后台模式。在命令末尾加上字符&。 结合sleep暂停10秒,通过ps命令来看看。

如下图所示,将sleep命令置入后台模式,在shell CLI提示符([root@hsr ~]#)返回之前,出现了后台作业号1,以及后台作业进程1317。通过ps可以看到,该后台命令进程1317一直在运行。

a8965c6952934b8db928a1e0c06b32ca

通过jobs命令可以查看当前后台模式的进程信息(另外jobs -l 显示进程号),如下图所示:

28a9fb5381aa475e8a48924617688d5a

一但10秒过后,后台进程完成,再输入命令jobs,可以看到该命令进程已完成,如下图所示:

2da6b9bdfe23432888cd59df69af3c8e

3.3 后台模式 进程列表子shell

在3.1中讲到了进程列表子shell, 进程列表是运行在子shell中的一条或多条命令。下面将进程列表置入后台模式,如下所示:当一级子shell的数字1显示在提示符的旁边时,按下回车键。

5f57f8aa133d4dfc878f79672637ae77

在使用shell时,很多情况下,可以将命令置入后台模式,例如在前面章节讲到的tar归档,下面演示创建备份文件,有效利用后台模式,下面将mysql的慢日志归档。

1df9c0dd55d249b28c877dec222ba4d7
87c9830a60e44d8c9e2cd0112df2ee26

将子shell要处理的进程置入后台模式,即可以在子shell中进行繁重的处理工作,又不会让子shell的I/O受制于终端。

欢迎添加个人微信号:Like若所思。

欢迎关注我的公众号,不仅为你推荐最新的博文,还有更多惊喜和资源在等着你!一起学习共同进步!

8532144a435f4ef994fefd9560d1d088
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值