电脑技术学习

对话 UNIX,第 13 部分: 另外十种命令行组合

dn001

  不过,每次输入反勾号操作是非常麻烦的。您可以使用下面的命令来代替这个序列:

$ file=state.`date '+%F'`
$ ps > $file
$ w >> $file

  但是,虽然这样做稍微有效一些,但仍然可能出现错误,因为在第二个或者后续的命令中,很可能使用 > 而不是 >>。要捕获一系列命令的输出,最简单的方法是使用大括号 ({ }) 将命令括起来。

$ { ps; w } > state.`date '+%F'`

  ps 命令运行(列出用户当前的进程),然后是 w(它将显示谁正在使用这台计算机),并将收集到的输出保存到一个文件中。

  注意: 您还可以在圆括号中嵌入一个命令序列,以得到相同的结果;然而,两者之间有一个重要的区别。在圆括号中的系列命令将在一个子 Shell 中运行,并且不会对当前 Shell 的状态产生影响。

  例如,您可能希望运行这个序列:$ { cd $HOME; ls
   -1}; pwd

  它将与下面的命令产生相同的输出:$ (cd $HOME; ls); pwd

  大括号中的命令更改了当前 Shell 的工作目录。后面的这种技术则无能为力。是使用组合还是子 Shell,这取决于您的目的,尽管子 Shell 的功能更强大一些,下面将对其进行描述。

  子 Shell 可以为您提供帮助!

  尽管通常运行子 Shell 将聚合的输出通过管道传递给单个命令,但您还可以使用子 Shell 对命令进行扩展,就像反勾号那样。然而更有价值的是,子 Shell 可以包含另一个子 Shell,所以还可以进行嵌套扩展。

  让我们来看看下面简单的例子。

$ {ps; w} > state.$(date '+%F')

  这个命令与 { ps; w } > state.`date '+%F'` 是相同的。$( ) 符号运行圆括号中的命令,然后使用输出来替换自己。换句话说,$() 可以进行扩展,就像反勾号一样。然而,与反勾号不同的是,$( ) 非常复杂,并且甚至可以包括其他 $( ) 扩展。下面提供了一些示例:

标签: