高级Shell脚本编程技巧与应用
1. 组命令与子shell
组命令和子shell在外观上相似,都可用于组合流以进行重定向,但它们之间存在重要区别。组命令在当前shell中执行其所有命令,而子shell在当前shell的子副本中执行命令。这意味着子shell会复制当前环境并在新的shell实例中运行,当子shell退出时,其环境副本会丢失,因此对其环境所做的任何更改(包括变量赋值)也会丢失。所以,在大多数情况下,除非脚本需要子shell,否则组命令比子shell更可取,因为组命令速度更快且占用内存更少。
1.1 子shell环境问题示例
在管道中使用read命令时,可能会遇到子shell环境问题。例如:
echo "foo" | read echo $REPLY上述代码中,REPLY变量的内容始终为空,因为read命令在子shell中执行,子shell终止时其REPLY副本会被销毁。由于管道中的命令总是在子shell中执行,任何进行变量赋值的命令都会遇到这个问题。
1.2 进程替换
为了解决上述问题,可以使用进程替换。进程替换有两种表达方式:
- 对于产生标准输出的进程:<(list)
- 对于接收标准输入的进程:>(list)
其中,list是