『忘了再学』Shell基础 — 10、Bash中的特殊符号(二)

虚幻大学 xuhss 308℃ 0评论

Python微信订餐小程序课程视频

https://blog.csdn.net/m0_56069948/article/details/122285951

Python实战量化交易理财系统

https://blog.csdn.net/m0_56069948/article/details/122285941

提示:本篇文章接上一篇文章,主要说说()小括号和{}大括号的区别与使用。

8、()小括号

():用于一串命令执行时,()中的命令会在子Shell中运行。(和下面大括号一起说明)

9、{}大括号

{}:用于一串命令执行时,{}中的命令会在当前Shell中执行。也可以用于变量变形与替换。

(1)父Shell和子Shell

在介绍小括号和大括号的区别之前,我们先要解释一个概念,那就是父Shell和子Shell。

用户登录到Linux系统后,系统将启动一个用户Shell。在这个Shell中,可以使用Shell命令声明变量,也可以创建并运行Shell脚本程序。运行Shell脚本程序时,系统将创建一个子Shell。此时,系统中将有两个Shell,一个是登录时系统启动的Shell,另一个是系统为运行脚本程序创建的Shell。当一个脚本程序运行完毕,它的脚本Shell将终止,可以返回到执行该脚本之前的Shell。从这种意义上来 说,用户可以有许多Shell,每个Shell都是由某个Shell(称为父Shell)派生的。

在Linux系统中的默认Shell是bash,在bash中是可以调用新的bash的。在开启远程终端时候所启动的默认的交互Shell就是父Shell,只需要直接执行bash命令,就会创建一个新的Shell,这个Shell就是子Shell。

执行下面命令:

shell

[root@localhost ~]# bash

我们就开启一个子Shell。

(2)区分父Shell子Shell

要区分是父Shell还是子Shell,需要使用前面所学的ps命令,查看进程命令来进行判断。

  • 执行ps -f查看系统进程。
    54a74de8c59d51b29adeb62b71d37011 - 『忘了再学』Shell基础 — 10、Bash中的特殊符号(二)
  • 执行bash命令,开启一个新的Shell,并再次查看系统进程。
    79e05df7f7c031cb5fd67057a07f8fb9 - 『忘了再学』Shell基础 — 10、Bash中的特殊符号(二)
    可以看到上图中,第二个进程的父id是第一个进程,所以第二个进程的bash是子Shell。
  • 退出子Shell,并再次查看系统进程。
    1133f6352cedc1d0d244dda8cc501b0a - 『忘了再学』Shell基础 — 10、Bash中的特殊符号(二)
    可以看到子Shell进程结束,消失了。

(3)查看父子Shell的关系

我们可以通过pstree命令(查看进程树),来查看父子Shell的关系。

在Red Hat 6 中,所有的进程都是init进程的子进程。如下图:

0c940fa106c6c2c521005f4ee188a6df - 『忘了再学』Shell基础 — 10、Bash中的特殊符号(二)

我们可以看到在init进程下,开启了一个sshd的进程,这个进程就是远程登陆进程。我们执行过一次远程登陆sshd,和开启bash功能,在此bash下执行过一次pstree命令。

在当前Shell中,再执行一边bash命令,再次执行pstree命令(查看进程树)。
如下图:

7a85599b514e9f9dac732aaf193e02f5 - 『忘了再学』Shell基础 — 10、Bash中的特殊符号(二)

我们可以从上图中看到,我在第一个bash下,又开启了一个新的bash,在新bash中执行了pstree命令。

所以说第一个bash是父(也就是父Shell),第二个bash是子(也就是子Shell)。

(4)父子Shell的关系拓展。

父Shell可以创建子Shell,在子Shell中还可以创建自己的子Shell。

它们的关系如下图所示:

0b5dd96495b39abe73d353dc0e40bd56 - 『忘了再学』Shell基础 — 10、Bash中的特殊符号(二)

下面来演示下这个关系图的Shell创建,和它们之前的关系层次。

下图中又创建了二个子Shell,总共三个子Shell。依次是子Shell, 孙Shell, 曾孙Shell。

f533a115f8b0e975d8e41f2d6f698bcd - 『忘了再学』Shell基础 — 10、Bash中的特殊符号(二)

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

9bdeb1f909d1e65a6f55b3418f89c7fa - 『忘了再学』Shell基础 — 10、Bash中的特殊符号(二)

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

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

a7194fe32fb67aed29e350edf680e840 - 『忘了再学』Shell基础 — 10、Bash中的特殊符号(二)

注意:当没有了子Shell时,再输入exit命令,将退出控制台终端。

(5)小括号和大括号的区别

知道了父Shell和子Shell的关系,我们接着解释小括号和大括号的区别。

小括号和大括号的主要区别在于,在Shell程序执行的时候,小括号或者大括号中的内容是在父Shell执行还是在子Shell中执行。

下面我们总结一下小括号和大括号的主要区别:

  • ()中执行一串命令时,需要重新开一个子Shell进行执行。
    在当前Shell中name=ss,当执行到()中命令的时候,会自动开启一个子Shell,在子Shell中name的变量赋予了mm,当()中命令运行完,子Shell进程就结束了,进程消失。里边的变量都不会保存,并自动返回到父Shell中,也就是回归到当前Shell,name的值还是原来Shell中赋予的ss值。
    示例如下:shell
    
    #在父Shell中定义变量name的值是ss
    [root@localhost ~]# name=ss

如果用()括起来一串命令,这些命令都可以执行。

给name变量重新赋值,但是这个值只在子Shell中生效

[root@localhost ~]#(name=mm;echo $name)
mm

父Shell中name的值还是ss,而不是mm

[root@localhost ~]# echo $name
ss

* { }中执行一串命令时,是在当前Shell执行。shell

用大括号来进行串命令的执行时

name变量的修改是直接在父Shell当中的

注意大括号的格式

[root@localhost ~]# { name=mm;echo $name; }
mm

所以name变量的值已经被修改了

[root@localhost ~]# echo $name
mm


就相当于直接在当前Shell执行{}中的语句,那么不写{}的结果是一样的。
* (){}都是把一串的命令放在括号里面,并且命令之间用号隔开。
* ()最后一个命令可以不用分号结尾。shell

[root@localhost ~]# ( name=lm; echo $name )

* {}中最后一个命令要用分号结尾。shell

[root@localhost ~]# { 空格 name=lm; echo $name; }

* {}中的第一个命令和左括号之间必须要有一个空格。shell

[root@localhost ~]# { 空格 name=lm; echo $name; }


* ()里的各命令不必和括号有空格。
* (){}中,括号里面的某个命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令。

> 
> 说明:小括号和大括号不太好理解,用的也不是太多,能看懂即可,工作中用不用在你自己。
> 
> 
> 

### 10、[]中括号

[]:用于变量的测试。(之后详解讲解)

  * [8、()小括号](#tid-ERRNtZ)
* [9、{}大括号](#tid-EEBHAA)
* [(1)父Shell和子Shell](#tid-F26DQN)
* [(2)区分父Shell子Shell](#tid-a6Spkt)
* [(3)查看父子Shell的关系](#tid-rWmA8x)
* [(4)父子Shell的关系拓展。](#tid-CaB8Gk)
* [(5)小括号和大括号的区别](#tid-FcYwhX)
* [10、[]中括号](#tid-4hiaSa)

   \_\_EOF\_\_

       - **本文作者:** [繁华似锦的博客](https://blog.csdn.net/biggbang)
 - **本文链接:** [https://blog.csdn.net/liuyuelinfighting/p/16129074.html](https://blog.csdn.net/biggbang)
 - **关于博主:** 评论和私信会在第一时间回复。或者[直接私信](https://blog.csdn.net/biggbang)我。
 - **版权声明:** 本博客所有文章除特别声明外,均采用 [BY-NC-SA](https://blog.csdn.net/biggbang "BY-NC-SA") 许可协议。转载请注明出处!
 - **声援博主:** 如果您觉得文章对您有帮助,可以点击文章右下角**【[推荐](javascript:void(0);)】**一下。

转载请注明:xuhss » 『忘了再学』Shell基础 — 10、Bash中的特殊符号(二)

喜欢 (3)

您必须 登录 才能发表评论!