Shell组命令
所谓组命令,就是将多个命令划分为一组,或者看成一个整体。
Shell 组命令的写法有两种:
对于第一种写法,花括号和命令之间必须有一个空格,并且最后一个命令必须用一个分号或者一个换行符结束。
子 Shell 就是一个子进程,是通过当前 Shell 进程创建的一个新进程。但是子 Shell 和一般的子进程(比如
组命令可以将多条命令的输出结果合并在一起,在使用重定向和管道时会特别方便。
例如,下面的代码将多个命令的输出重定向到 out.txt:
借助组命令,我们可以将以上三条命令合并在一起,简化成一次重定向:
类似的道理,我们也可以将组命令和管道结合起来:
在子 Shell 中执行意味着,运行环境被复制给了一个新的 shell 进程,当这个子 Shell 退出时,新的进程也会被销毁,环境副本也会消失,所以在子 Shell 环境中的任何更改都会消失(包括给变量赋值)。因此,在大多数情况下,除非脚本要求一个子 Shell,否则使用
Shell 组命令的写法有两种:
{ command1; command2; command3; . . . }
(command1; command2; command3;. . . )
{}
包围起来的组命名在当前 Shell 进程中执行,而由小括号()
包围起来的组命令会创建一个子 Shell,所有命令都在子 Shell 中执行。对于第一种写法,花括号和命令之间必须有一个空格,并且最后一个命令必须用一个分号或者一个换行符结束。
子 Shell 就是一个子进程,是通过当前 Shell 进程创建的一个新进程。但是子 Shell 和一般的子进程(比如
bash ./test.sh
创建的子进程)还是有差别的,我们将在《子Shell和子进程》一节中深入讲解,读者暂时把子 Shell 和子进程等价起来就行。组命令可以将多条命令的输出结果合并在一起,在使用重定向和管道时会特别方便。
例如,下面的代码将多个命令的输出重定向到 out.txt:
ls -l > out.txt #>表示覆盖 echo "https://www.xinbaoku.com/shell/" >> out.txt #>>表示追加 cat readme.txt >> out.txt本段代码共使用了三次重定向。
借助组命令,我们可以将以上三条命令合并在一起,简化成一次重定向:
{ ls -l; echo "https://www.xinbaoku.com/shell/"; cat readme.txt; } > out.txt
或者写作:(ls -l; echo "https://www.xinbaoku.com/shell/"; cat readme.txt) > out.txt
使用组命令技术,我们节省了一些打字时间。类似的道理,我们也可以将组命令和管道结合起来:
{ ls -l; echo "https://www.xinbaoku.com/shell/"; cat readme.txt; } | lpr
这里我们把三个命令的输出结果合并在一起,并把它们用管道输送给命令 lpr 的输入,以便产生一个打印报告。两种组命令形式的对比
虽然两种 Shell 组命令形式看起来相似,它们都能用在重定向中合并输出结果,但两者之间有一个很重要的不同:由{}
包围的组命令在当前 Shell 进程中执行,由()
包围的组命令会创建一个子Shell,所有命令都会在这个子 Shell 中执行。在子 Shell 中执行意味着,运行环境被复制给了一个新的 shell 进程,当这个子 Shell 退出时,新的进程也会被销毁,环境副本也会消失,所以在子 Shell 环境中的任何更改都会消失(包括给变量赋值)。因此,在大多数情况下,除非脚本要求一个子 Shell,否则使用
{}
比使用()
更受欢迎,并且{}
的进行速度更快,占用的内存更少。所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算