我该如何将多个命令的标准输出重定向到单个命令中?
示例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) | sort
aaa
kkk
zzz
$ (setopt; unsetopt; set) | sort
您可以使用{}
来实现此操作,而不需要像(list)
那样使用子Shell,操作如下:
{ echo zzz; echo aaa; echo kkk; } | sort
在{
之后和}
之前,我们确实需要一个空格字符。如果在单行上编写该序列,则还需要最后一个;
。
我们还可以将其分成多行而不需要任何;
:
示例1:
{
echo zzz
echo aaa
echo kkk
} | sort
例子2:
{
setopt
unsetopt
set
} | sort
(echo zzz & echo aaa & echo kkk) | sort
或者如果它在批处理文件中,它可以是单行(就像样例一样)也可以是多行:(
echo zzz
echo aaa
echo kkk
) | sort
echo diskpart_command
)与VHD/VHDX一起工作时,它非常有用,而不是在同一行上使用echo,但要保留echo
,还有另一种方法可以不使用echo而使用>
重定向器,但容易出错且更加复杂(如果存在一个简单的方法始终正常工作,为什么要使用一个复杂的容易出错的方式)...还要记住,%d%
给出了实际路径(对于不硬编码VHD/VHDX文件路径非常有用)。
shopt -s lastpipe
来更改这一点,它会在当前Shell中运行管道的最后一部分。但是在这种情况下,我们关心的是第一部分,因此它仍将在子Shell中运行。 - Gordon Davisson