Bash 和 shell

一、相关概念

1、什么是shell,什么是bash?

管理计算机硬件的其实是内核,用户正是通过shell来跟内核通信的,从本质上说shell是一个能执行各种命令的宏处理器。而bash(/bin/bash)就是linux默认的shell。

2、什么是子shell?

子shell就是从当前shell环境中新开了一个shell环境。子shell和父shell的关系就是子进程和父进程的关系。子shell可以从父shell中继承很多环境,如变量、命令全路径、文件描述符、当前工作目录、陷阱等等。

3、子shell如何产生?(https://www.linuxidc.com/Linux/2017-08/146606.htm)

Linux上创建子进程的方式有三种:一种是fork出来的进程,一种是exec出来的进程,一种是clone出来的进程。(先不讨论clone)
(1).fork是复制进程,它会复制当前进程的副本(不考虑写时复制的模式),以适当的方式将这些资源交给子进程。
(2).exec是加载另一个应用程序,替代当前运行的进程,也就是说在不创建新进程的情况下加载一个新程序。exec还有一个动作:在进程执行完毕后,退出exec所在的shell环境。为了进程安全,如要形成新的且独立的子进程,都会fork一份当前进程,然后在fork出来的子进程上调用exec来加载新的程序。

4、如何判断是否进入了子shell?

执行

[root@myp ~]# echo "$BASHPID"
6371

如果输出结果和父进程中的pid值不同则就是进入了子shell.

5、进入子shell中的情况

1.执行bash内置命令时
2.执行脚本文件时
3.执行bash命令时
4.执行shell函数时(直接执行时不会进入子shell但是放入管道中会进入子shell)
5.执行非bash内置命令时
6.命令替换
7.使用括号()组合一系列命令
8.放入后台运行的命令
9.进程替换

二、shell执行命令的过程

1.从终端或者shell脚本或者 bash -c "STR"中读取命令
2.将命令拆分成单词和运算符
3.将符号解析成简单或者复杂的命令
4.进行各种sh+ell扩展
5.重定向
6.执行命令
7.等待命令解释,收集结束转态

猜你喜欢

转载自blog.csdn.net/yu97271486/article/details/112462030