shell 命令队列

shell交互环境下,用户一般每次只能输入一个命令,等shell运行完这个命令,重新回到shell交互环境下,用户才可以输入下一个命令。

在某些应用场景下,shell也支持多命令执行:用户可以在交互环境下一次输入多个命令,然后shell按顺序依次执行各个命令:

命令1;命令2;命令3

各个命令之间使用分号隔开,敲击完要运行的命令后按回车键,然后shell就可以按照顺序依次执行命令1、命令2、命令3。

root@pc:/home/demo# ls; time; echo hello
a.out  hello.c

real    0m0.000s
user    0m0.000s
sys    0m0.000s
hello
root@pc:/home/demo#

除了按顺序执行的命令队列,shell还支持逻辑与、逻辑或来连接多个命令:

命令1 && 命令2
命令1 || 命令2

两个命令之间使用 && 连接,表示:如果命令1执行正确则继续执行命令2,否则就不执行命令2

两个命令之间使用 || 连接,表示:如果命令1执行正确,则不执行命令2,否则才会执行命令2

root@pc:/home/demo# ls && echo zhaixue.cc
a.out  hello.c
zhaixue.cc
root@pc:/home/demo# ls || echo zhaixue.cc
a.out  hello.c
root@pc:/home/demo# lsddd || echo zhaixue.cc
Command 'lsddd' not found, did you mean:
zhaixue.cc

通过运算结果我们可以看到,当ls命令运行正确时,使用 || 连接的echo命令就不再执行;而当lsddd命令运行出错时,使用 || 连接的echo命令才会执行。

shell 命令组合

在C语言中,我们可以使用一对大括号{}将一段代码包起来,这段代码就成了一个代码块,代码块里的变量有自己的生命周期和作用域规则。

shell中,我们可以将一些命令使用小括号包起来,小括号里面的命令组合和变量也有自己的作用域:

root@pc:/home/demo# a=1; echo $a; (a=10;echo $a); echo $a
1
10
1

在上面的命令队列中,我们插入了一个新的命令:使用小括号包起来的命令组合。在这个命令组合中重新定义了一个变量a,并赋值为10,shell执行完命令组合,继续执行后面的命令时,你会发现,变量a的值并没有改变,仍为1

这是因为,shell在执行使用小括号包起来的命令组合时,会创建一个子进程,也就是子shell环境,然后在这个子shell环境里去运行小括号里的命令,小括号的命令队列执行结束后,子进程退出,子shell环境也就消失了,shell会接着继续在当前shell环境下执行后面的命令。

如果将一组命令使用一对大括号{}包起来,shell就会在当前的shell环境在执行这个命令组合:

root@pc:/home/demo# a=1; echo $a; { a=10;echo $a; }; echo $a
1
10
10

通过对比我们可以看到,使用大括号{}包起来的命令组合,shell并没有创建子进程(子shell环境)去执行它。而是直接在当前的shell环境下执行这些命令组合。我们在大括号里重新给变量赋值为10,退出命令组合后,你会发现变量a的值也就变成了10

《Linux三剑客》视频教程:Linux下开发工具vim、Git、Makefile、autotools、qemu、debug精讲,从零开始一步一步写项目的Makefile,提供企业级Makefile模板,Git操作实战,vim从新手到高手,一步一步打造类似Source Insight的IDE!详情点击:王利涛老师个人淘宝店:Linux三剑客