将多个命令传递到单个命令中

时间:2012-08-11 21:13:04

标签: bash shell process pipe subshell

如何将多个命令的stdout传递给单个命令?

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

echo zzz; echo aaa; echo kkk

期望的输出:

aaa
kkk
zzz

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

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

3 个答案:

答案 0 :(得分:81)

使用括号()将命令组合到一个进程中,该进程将连接每个进程的stdout。

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

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


例2:

(setopt; unsetopt; set) | sort

答案 1 :(得分:9)

你可以使用{}来消除对(list)中子shell的需求,如下所示:

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

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

我们也可以在多行上编写它而无需任何;

示例1:

{
  echo zzz
  echo aaa
  echo kkk
} | sort

示例2:

{
  setopt
  unsetopt
  set
} | sort

答案 2 :(得分:2)

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

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

(
 echo zzz
 echo aaa
 echo kkk
) | sort

注意:原帖不提及它仅适用于Linux,所以我添加了Windows命令行的解决方案...当使用带有diskpart的脚本中的VHD / VHDX时,它非常有用(echo diskpart_command)而不是相同的回声,但让echo,还有另一种方式没有回声和>重定向器,但它很容易出错,写得复杂得多(为什么用一个复杂的容易出错的方法,如果存在一个总体运作良好的简单方法)...还记得%d%给你实际的路径(对于不硬编码VHD / VHDX文件的路径非常有用)。