【发布时间】:2013-08-06 12:36:43
【问题描述】:
group命令{ list; }应该在当前shell环境下执行list。
这允许变量赋值之类的东西在命令组之外可见 (http://mywiki.wooledge.org/BashGuide/CompoundCommands)。
我使用它将输出发送到日志文件以及终端:
{ { echo "Result is 13"; echo "ERROR: division by 0" 1>&2; } | tee -a stdout.txt; } 3>&1 1>&2 2>&3 | tee -a stderr.txt;
关于“在 shell 脚本中将 stdout 和 stderr 传递给两个不同的进程?”主题?在这里阅读:pipe stdout and stderr to two different processes in shell script?。
{ echo "Result is 13"; echo "ERROR: division by 0" 1>&2; }
模拟输出到 stdout 和 stderr 的命令。
我也想评估退出状态。 /bin/true 和 /bin/false 模拟可能成功或失败的命令。所以我尝试将$?保存到变量r:
~$ r=init; { /bin/true; r=$?; } | cat; echo $r;
init
~$ r=init; { /bin/true; r=$?; } 2>/dev/null; echo $r;
0
如您所见,上面的管道构造没有设置变量r,而第二个命令行导致了预期的结果。这是一个错误还是我的错?谢谢。
我使用以下版本的 bash 测试了 Ubuntu 12.04.2 LTS (~$) 和 Debian GNU/Linux 7.0 (wheezy) (~#):
~$ echo $BASH_VERSION
4.2.25(1)-release
~# echo $BASH_VERSION
4.2.37(1)-release
【问题讨论】:
-
{ ... }确实意味着在当前 shell 环境中运行一个简单的命令,|(和某些其他结构)意味着在子 shell 中运行一个或多个命令,无论它是否被 @ 包围987654337@或( ... )或不。 -
我明白了。手册页正确地指出:“管道中的每个命令都作为单独的进程执行(即在子外壳中)。”这就是答案。感谢 Douglas Leeder 指出了如何分析子 shell 的混淆。
标签: bash