从上面的父子shell的图表中可以看到:
1.使用source和点,执行脚本,旨在当前的shell环境中执行生效
2.指定/bin/bash解释器运行脚本,是开启了一个subshell,开启子shell运行脚本命令。
3…/script,都会指定shebang,通过解释器运行,也是开启subshell运行命令。
父shell概念
pstree 看到如下结果,就是父shell
pstree
├─sshd───sshd───sshd───bash───pstree
也可以使用ps进程管理命令查看
ps -ef
-f 显示UID PID PPID
-e 列出所有进程的信息,如同-A选项option
ps -ef --forest
root 3105 1 0 2月22 ? 00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
root 4616 3105 0 2月22 ? 00:00:00 \_ sshd: xiao123 [priv]
xiao123 4652 4616 0 2月22 ? 00:00:00 \_ sshd: xiao123@pts/0
xiao123 4653 4652 0 2月22 pts/0 00:00:00 \_ -bash
xiao123 101694 4653 0 17:35 pts/0 00:00:00 \_ ps -ef --forest
子shell概念
bash #开启一个子shell
ps -ef --forest #查看当前子shell
root 3105 1 0 2月22 ? 00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
root 4616 3105 0 2月22 ? 00:00:00 \_ sshd: xiao123 [priv]
xiao123 4652 4616 0 2月22 ? 00:00:00 \_ sshd: xiao123@pts/0
xiao123 4653 4652 0 2月22 pts/0 00:00:00 \_ -bash #父shell
xiao123 101698 4653 0 17:41 pts/0 00:00:00 \_ bash #子shell
xiao123 101705 101698 0 17:41 pts/0 00:00:00 \_ ps -ef --forest
图示如下:
多个子shell概念
ps -ef --forest
root 3105 1 0 2月22 ? 00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
root 4616 3105 0 2月22 ? 00:00:00 \_ sshd: xiao123 [priv]
xiao123 4652 4616 0 2月22 ? 00:00:00 \_ sshd: xiao123@pts/0
xiao123 4653 4652 0 2月22 pts/0 00:00:00 \_ -bash #父shell
xiao123 101698 4653 0 17:41 pts/0 00:00:00 \_ bash #子shell
xiao123 101706 101698 0 17:47 pts/0 00:00:00 \_ sh #孙shell
xiao123 101708 101706 0 17:48 pts/0 00:00:00 \_ bash #曾孙shell
xiao123 101715 101708 0 17:48 pts/0 00:00:00 \_ ps -ef --forest
只要输入exit
,就可以推出子shell了。
创建进程列表(创建子shell执行命令)
我们可以将一系列命令打包在一起执行,这种方式称为进程列表。进程列表一般使用()
来进行打包命令。
(cd ~;pwd;ls;cd /tmp;ls)
检查是否在子shell环境中
linux 默认有关SHELL的变量
BASH_SUBSHELL # 此变量如果是0,表示在当前shell中执行,否则是开启子shell执行
检测是否开启了子shell命令
xiao123@xiao123:~/Downloads/shscripts$ (cd ~;pwd;ls;cd /tmp;ls; echo $BASH_SUBSHELL;)
/home/xiao123
Desktop Documents Downloads Music Pictures Public snap Templates Videos
snap-private-tmp
systemd-private-51e7222707984dbab3f56eff4ef54a5b-colord.service-v785SA
systemd-private-51e7222707984dbab3f56eff4ef54a5b-ModemManager.service-mXYq1V
systemd-private-51e7222707984dbab3f56eff4ef54a5b-power-profiles-daemon.service-0JeaMY
systemd-private-51e7222707984dbab3f56eff4ef54a5b-switcheroo-control.service-oLl0Ls
systemd-private-51e7222707984dbab3f56eff4ef54a5b-systemd-logind.service-IXrXZv
systemd-private-51e7222707984dbab3f56eff4ef54a5b-systemd-oomd.service-QcR0as
systemd-private-51e7222707984dbab3f56eff4ef54a5b-systemd-resolved.service-UCO5Ms
systemd-private-51e7222707984dbab3f56eff4ef54a5b-systemd-timesyncd.service-D6KjOt
systemd-private-51e7222707984dbab3f56eff4ef54a5b-upower.service-0TC21K
tracker-extract-3-files.127
tracker-extract-3-files.999
VMwareDnD
1
xiao123@xiao123:~/Downloads/shscripts$
子shell嵌套运行
子shell可以嵌套多个,如下示例:
xiao123@xiao123:~/Downloads/shscripts$ (pwd; echo $BASH_SUBSHELL;)
/home/xiao123/Downloads/shscripts
1
xiao123@xiao123:~/Downloads/shscripts$ (pwd; (echo $BASH_SUBSHELL;))
/home/xiao123/Downloads/shscripts
2
xiao123@xiao123:~/Downloads/shscripts$ (pwd; (ls;(echo $BASH_SUBSHELL;)))
/home/xiao123/Downloads/shscripts
chaochao_1_finished.png chaochao_2.jpg chaochao_4_finished.png chaochao_5.jpg
chaochao_1.jpg chaochao_3_finished.png chaochao_4.jpg del_data.sh
chaochao_2_finished.png chaochao_3.jpg chaochao_5_finished.png
3
xiao123@xiao123:~/Downloads/shscripts$