组命令和子shell

在bash中,有两种方式可以将命令组合到一起,一种是组命令,另一种是子shell。格式如下:# 组命令

{ commnad1; command2; [ command3.. ] }

# 子shell

(command1; command2; [command3..])1

2

3

41

2

3

4

上面两种形式的差别在于:1.组命令使用花括号括起来,前花括号和后花括号与命令之间要有一个空格,并且闭合花括号前要用分号或换行结束命令。2.对于子shell,只需要用圆括号包围即可。

执行重定向

那么,组命令和子shell有什么用途呢?尽管它们有一个主要的区别,但是它们都可以用来管理重定向。下面请看这个例子:[fbap:/home/fbap/usertmp]>ls -l > output.txt

[fbap:/home/fbap/usertmp]>echo "hello world" >> output.txt

[fbap:/home/fbap/usertmp]>cat foo.txt >> output.txt1

2

31

2

3

显然,上面的3条命令将输出重定向到output.txt。使用组命令,可以将它们合并成一行:{ ls -l; echo "hello world"; cat foo.txt; } > output.txt11

当然,你也可以使用子shell的方式:(ls -l; echo "hello world"; cat foo.txt;) > output.txt11

在上面的例子中,使用组命令和子shell可以减少一些输入。但是,组命令和子shell真正有价值的地方在于管道的使用。当创建命令管道时,通常将多条命令的结果输出到一条流中,这很有用。{ ls -l; echo "hello world"; cat foo.txt; } | lpr11

这里,我们将3个命令的输出进行合并,并通过管道输出到lpr的输入以产生一个打印报告。

进程替换

虽然组命令和子shell看起来很相似,都可以用来为重定向整合流,但是,它们有一处主要的不同。子shell(正如其名字)在当前shell的子拷贝中执行命令,而组命令则是直接在当前shell中执行所有命令。这以为子shell会复制当前环境变量以创建一个新的shell实例。当子shell退出时,复制的环境变量也就消失了,因此对任何子shell(包括变量赋值)的改变也同样丢失了。所以,大多数情况下,除非脚本需要子shell,否则使用组命令比子shell更快,占用内存也更少。

请看下面的例子:echo 'foo' | read

echo $REPLY1

21

2

在上面的例子中,REPLY的内容总是空的,因为read命令是在子shell中执行的,并且当子shell终止的时候,REPLY的拷贝也遭到了破坏。

很幸运的是,shell提供了一种叫做进程替换的外部扩展方式来解决这个问题。

实现进程替换的方式有两种:# 产生标准输出的进程

# 吸纳标准输入的命令

>(list)1

2

3

4

51

2

3

4

5

为了解决上述read命令的问题,我们可以像这样使用进程替换:read <

echo $REPLY1

21

2

进程替换允许将子shell当成普通的文件,目的是为了重定向。事实上,这是一种扩展形式,我们可以查看它的真实值。[fbap:/home/fbap]>echo

/dev/fd/631

21

2

通过使用echo查看扩展结果,可以看到文件/dev/fd/63正为子shell提供输出。

以下是一个读循环的实例,该实例用循环处理子shell创建的目录列表的内容:#!/bin/bash

# 注:

# 1.如果将此处的内容另存为一个脚本如sub-proc.sh,但是如果像这样执行脚本:sh sub-proc.sh,shell将报错syntax error(语法错误)。

#

# 正确的执行方式是:

# 1)脚本添加可执行权限: chmod u+x sub-proc.sh

# 2)使用相对(绝对)路径: ./sub-proc.sh

while read attr links owner group size date_1 date_2 year filename

do

cat <

文件名: ${filename}

大小: ${size}

拥有者: ${owner}

属性: ${attr}

EOF

echo "======================="

done <

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

191

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

执行命令:./sub-proc.sh | head -n 10,得到如下输出:[fbap:/home/fbap/usertmp]>./sub*sh|head -n 10

文件名: AFA_TEST_NEWADM.ixf

大小: 4783

拥有者: fbap

属性: -rw-rw-r--.

=======================

文件名: all_python_files.log

大小: 1168088

拥有者: fbap

属性: -rw-rw-r--.

=======================

sh linux 一组命令,linux中的组命令和子shell相关推荐

  1. 在 Windows 命令行中实现 cp 命令

    第一步,创建一个文本文件,输入如下内容: @echo off copy %* 第二步,将上面的文本文件另存为 cp.bat 保存到 C:\Windows 目录下,然后就可以用了 如果按照本示例的用法, ...

  2. linux中sudo命令_Linux中的Sudo命令

    linux中sudo命令 Sudo is one of the most widely used commands by Linux administrators and beginners alik ...

  3. linux用户组管理命令_Linux用户和组命令能力问题和解答

    linux用户组管理命令 This section contains Aptitude Questions and Answers on Linux User and Group Commands. ...

  4. linux中nohup命令_Linux中的Nohup命令

    linux中nohup命令 When exiting the shell of a Linux System, all running processes are usually terminated ...

  5. linux查找一个文件中abc字段命令,Linux查询命令整理(示例代码)

    在linux中,查找命令主要有find和grep,以及mlocate/locate 区别: (1)find命令是根据文件的属性进行查找,如文件名,文件大小,所有者,所属组,是否为空,访问时间,修改时间 ...

  6. linux中top命令_Linux中的top命令指南

    linux中top命令 The atop command is a tool for monitoring system resources in Linux. It displays tons of ...

  7. linux导出日志命令_Linux中的导出命令

    linux导出日志命令 In this guide, we will look at the export command in Linux. Export is a built-in command ...

  8. java解析shell命令_Android中执行java命令的方法及java代码执行并解析shell命令

    这篇文章给大家介绍Android中执行java命令的方法及java代码执行并解析shell命令,需要的朋友一起学习 android中执行java命令的方法大家都晓得吗,下面一段内容给大家带来了具体解析 ...

  9. 如何在命令行中使用 ftp 命令上传和下载文件

    转摘:https://linux.cn/article-6746-1.html 本文中,介绍在 Linux shell 中如何使用 ftp 命令.包括如何连接 FTP 服务器,上传或下载文件以及创建文 ...

最新文章

  1. 贝叶斯理论与朴素贝叶斯分类理论(Naive Bayesian Model,NBM)
  2. OSINT系列:威胁信息挖掘ThreatMiner
  3. 合肥python培训-合肥Python测试开发全栈核心课程
  4. JavaScript(基础、高级)笔记汇总表【尚硅谷JavaScript全套教程完整版】
  5. SAP Cloud Platform上的WebIDE fullstack在哪里打开
  6. Unhandled event loop exception PermGen space
  7. 二维数组做函数参数传递
  8. 点集的视点特征直方图的评估
  9. python官网无法访问_python写的网站,云服务器经常无法访问
  10. [C指针] 用图表解读C声明:Unscrambling C Declarations by Diagram
  11. python 输入列表 返回每个元素出现的次数
  12. 【PHP学习】—PHP的基本数据类型(二)
  13. 实践经验:应该如何使用Docker?
  14. Mstsc、Telnet、SSH之间的区别
  15. oauth2基本概念
  16. 如何将NCM转换成MP3 - NCM转MP3转换软件
  17. Windows消息前缀
  18. 数字营销卷得再狠,「阿琉克斯之踵」不能忽视
  19. F 小名的回答 (奇偶) 湖南师范大学2018年大学生程序设计竞赛新生赛
  20. OpenERP-指定动作视图

热门文章

  1. spring boot 配置网关时404错误_Kong中使用grpcweb插件代理grpc服务时遇到的坑
  2. docker update_windows 10 安装docker
  3. mfc combobox dropdown中编辑框不可输入的属性设置_实践 | 一文知晓MES系统中的批次管控功能...
  4. VS2012下基于Glut OpenGL显示一些立体图形示例程序:
  5. 风一样的坑爹哥rust1_醒醒吧,烂大街的“北欧风”根本不实用!
  6. python txt文件 报文分析_Python读写txt文本文件的操作方法全解析
  7. Win7系统经常报错怎样解决?
  8. Image合并添加文字内容
  9. 测试网站的url脚本测试网站是否正常
  10. appium-python 学习记录