68

如何将多个命令的标准输出通过管道传输到单个命令?

示例 1:对所有三个 echo 命令的输出进行组合和排序:

echo zzz; echo aaa; echo kkk

所需的输出:

aaa
kkk
zzz

示例 2:重写以下内容,以便所有命令都在使用管道的单个命令行中,而不重定向到临时文件:

setopt > /tmp/foo; unsetopt >> /tmp/foo; set >> /tmp/foo; sort /tmp/foo
4

3 回答 3

99

使用括号 () 将命令组合成一个进程,这将连接每个命令的标准输出。

示例 1(注意$是 shell 提示符):

$ (echo zzz; echo aaa; echo kkk) | sort
aaa
kkk
zzz


示例 2:

(setopt; unsetopt; set) | sort
于 2012-08-11T21:13:04.080 回答
24

您可以使用{}它并消除对子外壳的需要(list),如下所示:

{ echo zzz; echo aaa; echo kkk; } | sort

我们确实需要一个空格字符 after{和 before };当序列写在一行上时,我们还需要最后一个。

我们也可以将它写成多行而不需要任何;

示例 1:

{
  echo zzz
  echo aaa
  echo kkk
} | sort

示例 2:

{
  setopt
  unsetopt
  set
} | sort
于 2017-02-15T19:12:57.070 回答
1

在 Windows 中,它将如下所示:(echo zzz & echo aaa & echo kkk) | sort

或者,如果它在批处理文件中,它可以是单行(如示例)以及多行:

(
 echo zzz
 echo aaa
 echo kkk
) | sort

注意:原来的帖子没有提到它只适用于 Linux,所以我添加了 Windows 命令行的解决方案......当使用 VHD/VHDX 与脚本 ( echo diskpart_command) 中的磁盘部分而不是相同的 echo 时,它非常有用,但是让那里echo,还有另一种没有回声和>重定向器的方法,但它很容易出错并且编写起来更复杂(如果存在一种总是很好用的简单方法,为什么要使用复杂的容易出错的方法).. . 还记得%d%给你实际的路径(对于不对 VHD/VHDX 文件的路径进行硬编码非常有用)。

于 2016-12-12T14:36:52.233 回答