父子shell实例

发布时间 2023-10-09 18:01:31作者: WeChat2834
父子shell
  1. source 和点执行脚本,只在当前shell环境中执行生效
  2. 指定解释器sh 或bash等,执行脚本,是开启子shell运行脚本命令
  3. 用绝对路径或相对路径,也都会指定shebang,通过解释器运行,也是开启子shell运行命令
父shell概念

pstree看到如下情况,就是父shell环境

   │     └─3*[{gdm}]
        ├─geoclue───2*[{geoclue}]
        ├─gnome-keyring-d───3*[{gnome-keyring-d}]
        ├─gnome-shell-cal───5*[{gnome-shell-cal}]
        ├─gnome-terminal-─┬─bash───pstree   ####

ps进程命令查看

ps -ef 
    -f 显示UID,PID,PPID
    -e 列出所有进程的信息,如同-A选项
ps -ef --forest
root      2886     1  0 14:59 ?        00:00:03 /usr/libexec/gnome-terminal-server
root      2894  2886  0 14:59 ?        00:00:00  \_ gnome-pty-helper
root      2895  2886  0 14:59 pts/0    00:00:00  \_ bash
root      3291  2895  0 15:20 pts/0    00:00:00      \_ bash
root      3338  3291  0 15:21 pts/0    00:00:00          \_ ps -ef --forest

父子shell

父shell发出命令:bash ----->bash的子shell发出命令:bash----->bash的孙shell发出命令:bash-->bash的曾孙shell发出命令: ps --forest

只要输入exit;就能退出子shell环境

创建进程列表(创建子shell执行命令)

假如需要执行一系列shell命令

ls;cd ;pwd;echo "奥里给"

列表,肯定是被包括起来的数据

shell进程列表理念,需要使用()小括号,如下执行方式,就称之为,进程列表

加上小括号,就是开启子shell命令

[root@localhost tmp]# (ls;pwd;cd; echo hello)
!  demo1.sh  myshell.sh  MyVar.sh  nohup.out  sub_str
/root/tmp
hello
[root@localhost tmp]# ps -ef --forest

检测是否在子shell环境中
#linux默认有关shell的变量
#该变量的值的命令结果是0就是当前shell
BASH_SUBSHELL
[root@localhost tmp]# 
[root@localhost tmp]# ls ;pwd;cd;echo $BASH_SUBSHELL
!  demo1.sh  myshell.sh  MyVar.sh  nohup.out  sub_str
/root/tmp
0
[root@localhost ~]# (ls ;pwd;cd;echo $BASH_SUBSHELL)
anaconda-ks.cfg  install.log  testyy.sh  tmp  公共  模板  视频  图片  文档  下载  音乐  桌面
/root
1
[root@localhost ~]# 

为什么要开启子shell,如果要执行一个ping命令,如果直接当前环境使用就会一致执行,无法进行其他操作。

子shell嵌套运行

一个小括号,开启一个子shell运行命令,还可以嵌套多个

[root@localhost ~]# (pwd;(pwd;(echo $BASH_SUBSHELL)))
/root
/root
3
[root@localhost ~]# 

利用括号,开启子shell的理念,以及检查,在shell脚本开发中,经常会用子shell进行多进程的处理,提高程序并发执行效率。

还剩下的问题

程序并发执行,

父子shell和后台运行的关系