曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 6007|回复: 2
打印 上一主题 下一主题

花括号与圆括弧中的指令组

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2011-6-4 10:17:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在 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 里执行程序了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-4-29 06:03 , Processed in 0.078055 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表