Bash 将多个命令管道化为单个命令
如何将多个命令的stdout通过管道传输到单个命令 示例1:合并并排序所有三个echo命令的输出:Bash 将多个命令管道化为单个命令,bash,shell,process,pipe,subshell,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 使用括号()将命令组合成一个进程,该进程将
echo zzz; echo aaa; echo kkk
期望输出:
aaa
kkk
zzz
示例2:重写以下命令,使所有命令都使用管道位于单个命令行中,而不重定向到临时文件:
setopt > /tmp/foo; unsetopt >> /tmp/foo; set >> /tmp/foo; sort /tmp/foo
使用括号()将命令组合成一个进程,该进程将连接每个命令的标准输出
示例1(请注意,$
是shell提示符):
例2:
(setopt; unsetopt; set) | sort
{
setopt
unsetopt
set
} | sort
在Windows中,它将如下所示:
(echo zzz&echo aaa&echo kkk)|排序
或者,如果它位于批处理文件中,则可以是单行(如示例)也可以是多行:
(
echo zzz
echo aaa
echo kkk
) | sort
注意:原来的帖子没有提到它只适用于Linux,所以我添加了针对Windows命令行的解决方案。。。当在脚本内部使用diskpart(
echo diskpart_command
)而不是在同一脚本上使用echo时,使用VHD/VHDX非常有用,但是如果使用echo
,还有另一种不使用echos和
重定向器的方法,但是它很容易出错,而且编写起来更复杂(如果存在一种简单的方法,那么为什么要使用一种容易出错的复杂方法呢?)。还要记住%d%
提供了实际路径(对于不硬编码VHD/VHDX文件的路径非常有用)。您可以使用{}
来实现这一点,并且不再需要(列表)
中的子shell,如下所示:
{ echo zzz; echo aaa; echo kkk; } | sort
在{
之后和}
之前,我们确实需要一个空格字符。当序列写在一行上时,我们还需要最后一个;
我们也可以在多行上编写它,而不需要任何;
:
例1:
{
echo zzz
echo aaa
echo kkk
} | sort
例2:
(setopt; unsetopt; set) | sort
{
setopt
unsetopt
set
} | sort
@glenn:这没关系(在bash 3.2.48中测试),因为管道会强制它进入子shell。@KennyEvitt检查:“管道中的每个命令都在它自己的子shell中执行…”。实际上,这可以用更改,它运行当前shell中管道的最后一段。但在本例中,它是我们关注的第一段,因此它仍然在子shell中运行。@KennyEvitt它似乎将它们合并为一个单独的子shell级别(至少在bash下,测试w/version2.05b.0、3.2.57和4.2.10;其他shell可能不同)。