shell中组合命令的方法

  参考:http://www.zsythink.net/archives/1166

  在shell中,有两种组合命令的方法,在介绍这两种方法之前,我们先来看一个小示例。

  目前有两个目录,这两个目录分别为/test1和/test2,目录中分别存在如下文件。

1
2
3
4
5
[root@node1 ~]# ls /test1
t1  t2  t3
[root@node1 ~]# ls /test2
t4
[root@node1 ~]#

   此刻,如果我们想要统计这两个目录中一共有多少个文件,该怎样编写shell呢,编写如下的shell命令,能够达到目的吗?

1
[root@node1 ~]# ls /test1;ls /test2 | wc -l

   上述命令是无法统计出两个目录中的文件数量的,因为执行结果如下。

1
2
3
4
[root@node1 ~]# ls /test1;ls /test2 | wc -l
t1  t2  t3
1
[root@node1 ~]#

   从上述执行结果可以看出,前两条命令并没有一起执行,而是第一条命令执行完毕后,再把后面的命令当做一个整体执行了,即执行了第一条命令显示了文件夹/test1下三个文件名 然后把ls /test2 | wc -l作为一条语句执行了打印了文件夹下面多少个文件数即1

  那么如果我们想要让前两条命令当做一个整体执行,该怎样做呢?

1
2
3
4
5
[root@node1 ~]# (ls /test1;ls test2)| wc -l
4
[root@node1 ~]# { ls /test1;ls test2; }| wc -l
4
[root@node1 ~]#

   上图中,我们分别使用小括号"( )" 与 大括号"{ }"将前两个命令组合在了一起。两种方法都能达到我们的目的,但是,这两种方法是有所不同的,先说说第一种,当使用"小括号"将两条命令括起以后,这两条命令相当于在当前shell的子shell中执行,也就是说,这两条命令并不是在当前进程中运行的,而是在当前进程的子进程中运行的,而使用"大括号"时则不同,被大括号括起的命令是在当前进程中执行的。那么,我们怎样证明上述理论呢,我们可以做一个小实验,如下图。

1
2
3
4
5
6
7
8
9
10
11
[root@node1 ~]# (cd;exit)
[root@node1 ~]# { cd;exit; }
登出
Connection closing...Socket close.
 
Connection closed by foreign host.
 
Disconnected from remote host(local-iptables-test-001146) at 13:43:46.
 
Type `help' to learn how to use Xshell prompt.
[C:\~]$

   当我们使用小括号将命令聚合以后,因为是在子进程中执行,所以即使exit命令生效,也是退出子进程,而不是退出当前shell进程,但是如果使用大括号将命令组合,则表示在当前shell进程中运行命令,所以,当exit命令生效时,则会退出当前shell进程。

  好了,这就是使用"大括号"与使用"小括号"的不同之处,其实,在使用大括号时,还需要注意一些额外的注意点,细心如你一定已经发现了,上述所有使用"大括号"的示例中,大括号内的所有命令都用空格隔开了,而且大括号内的每个命令都必须以分号";"结尾,即使是大括号内的最后一个命令,也需要以分号结尾,而且需要用空格与大括号隔开,这就是使用这种方法的注意点,其实,这种用大括号聚合命令的方法是使用了函数中"代码块"的语法,在函数中,一个函数的代码块就会用大括号括起,表示是一个函数的整体,此处我们也可以这样理解,我们将多个命令用大括号括起,表示他们是一个代码块,是一个整体,我们可以把这种没有函数名只有函数体的代码块理解为匿名函数,当然,如果你还不了解shell的函数,没有关系,只需要记住这种用法即可。

 

posted @   minseo  阅读(1825)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
历史上的今天:
2019-09-23 Linux之date命令详解
点击右上角即可分享
微信分享提示