Bash :(命令)|命令

时间:2014-03-07 08:29:44

标签: bash

我偶然发现Zenity,这是一个基于命令行的GUI。我注意到有一些( commands ) | command形式的语法。任何人都可以了解这是什么以及我可以在哪里阅读更多信息吗?

我在docs

中找到了以下脚本
(
  echo "10" ; sleep 1
  echo "# Updating mail logs" ; sleep 1
  echo "50" ; sleep 1
  echo "This line will just be ignored" ; sleep 1
  echo "100" ; sleep 1
) |
 zenity --progress \
   --title="Update System Logs" \
   --text="Scanning mail logs..." \
   --percentage=0

2 个答案:

答案 0 :(得分:1)

括号创建一个子shell,包含它对当前shell的所有含义。

  • 子shell无法改变父shell的环境;有时,你想要一个子shell,以便你可以快速cd到另一个目录而不影响脚本其余部分的工作目录
  • 子shell有一个标准输入和一个标准输出流;这通常是启动子shell的原因
  • 父shell在子shell完成命令时等待(除非您在后台运行它)

如果有帮助,请将( foo; bar )视为快速说出sh -c 'foo; bar'的方法。

一个相关的语法是大括号,它在当前shell中运行复合命令,而不是子shell。

test -f file.rc || { echo "$0: file.rc not found -- aborting" >&2; exit 127; }

exit特别导致当前 shell以失败退出代码退出,而退出的子shell不会直接影响父shell脚本的其余部分。

(奇怪的是,POSIX在结束括号之前需要一个语句终止符,但不是在右括号之前。)

答案 1 :(得分:1)

括号分隔子shell,这意味着parens中的命令在单独的进程中运行,并由bash解释器的单独实例解释。在这种情况下,它们似乎正在使用子shell将所有echosleep命令组合在一起,以便它们可以通过zenity管理整组命令的组合输出。鉴于此示例中的目标是模拟进度条,这是有道理的。

您可以在此处详细了解子广告:http://tldp.org/LDP/abs/html/subshells.html