曲径通幽论坛

标题: 花括号与圆括弧中的指令组 [打印本页]

作者: beyes    时间: 2011-6-4 10:17
标题: 花括号与圆括弧中的指令组
在 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 里执行程序了。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2