在 shell 中可以将一组指令用放在花括号 { } 和圆括弧中 ( ) 中执行。
在花括号中的指令组在语法上被视为一条指令,当指令的结果通过管道符时,它们按照从左到右的顺序输出,形成一个输出流,例如:$ { echo "I am in `pwd` now"; date; ls -al; } | write root 这样就会将 { } 中的命令输出通过 write 命令一股脑的发给 root 然后自己退出。
使用花括号命令组时需要注意第一个命令和左括号间要有个空格,而最后的一个命令和右括号之间并不要求要有空格,但是要求有一个分号;各个命令之间用分号隔开。
命令组也可以放到圆括弧中,如: $ (echo "I am in `pwd` now"; date; ls -al) |write root 如上,圆括弧没有花括号的那种要求,即第一个命令与左括弧之间不需要有空格,而右括弧和最后一个命令之间也不需要有分号。
两种情况看似一样,但有着重要区别:
( ) 里的命令会在一个子shell进行执行。
{ } 里的命令在当前 shell 执行。
可以通过 $BASH_SUBSHELL 这个环境变量验证。脚本如下:
[Bash shell] 纯文本查看 复制代码 #!/bin/bash
echo "Subshell level OUTSIDE subshell = $BASH_SUBSHELL"
{ echo "Subshell level INSIDE subshell = $BASH_SUBSHELL"; }
(
echo "Subshell level INSIDE subshell = $BASH_SUBSHELL"
)
运行输出:beyes@debian:~/shell$ ./sshell.sh
Subshell level OUTSIDE subshell = 0
Subshell level INSIDE subshell = 0
Subshell level INSIDE subshell = 1 由输出可见,当执行到 ( ) 中的 echo 指令时,BASH_SUBSHELL 变量变为 1,说明它已经在第一层子 shell 里执行程序了。 |