如何在 shell 中将多个命令传输到单个命令中? (嘘,重击,...)

问题描述 投票:0回答:3

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

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

echo zzz; echo aaa; echo kkk

所需输出:

aaa
kkk
zzz

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

setopt > /tmp/foo; unsetopt >> /tmp/foo; set >> /tmp/foo; sort /tmp/foo
bash shell process pipe subshell
3个回答
110
投票

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

示例1(注意

$
是shell提示符):

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

示例2:
$ (setopt; unsetopt; set) | sort

29
投票

您可以使用

{}
来实现此目的,并消除对子 shell 的需要,如
(list)
中所示,如下所示:

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

我们确实需要在

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

我们也可以将其写在多行上,而不需要任何

;

示例1:

{
  echo zzz
  echo aaa
  echo kkk
} | sort

示例2:

{
  setopt
  unsetopt
  set
} | sort

3
投票

在 Windows 中,如下所示:

(echo zzz & echo aaa & echo kkk) | sort

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

(
 echo zzz
 echo aaa
 echo kkk
) | sort

注意:原帖没有提到它仅适用于Linux,所以我添加了Windows命令行的解决方案...在使用脚本内的diskpart(

echo diskpart_command
)而不是echo来使用VHD/VHDX时非常有用同样,但是让
echo
存在,还有另一种没有回声并带有
>
重定向器的方法,但是它很容易出错并且编写起来更加复杂(如果存在的话为什么要使用复杂的容易出错的方法一种始终有效的简单方法)...还要记住
%d%
为您提供实际路径(对于不硬编码 VHD/VHDX 文件的路径非常有用)。

© www.soinside.com 2019 - 2024. All rights reserved.