如何将多个命令的标准输出集合到单个命令中?将多个命令集成为单个命令
实施例1:结合和排序所有三个回波命令的输出:
echo zzz; echo aaa; echo kkk
期望的输出:
aaa
kkk
zzz
实施例2:重写以下,以使所有命令都是在一个单一的命令行使用管道,而不重定向到临时文件:
setopt > /tmp/foo; unsetopt >> /tmp/foo; set >> /tmp/foo; sort /tmp/foo
如何将多个命令的标准输出集合到单个命令中?将多个命令集成为单个命令
实施例1:结合和排序所有三个回波命令的输出:
echo zzz; echo aaa; echo kkk
期望的输出:
aaa
kkk
zzz
实施例2:重写以下,以使所有命令都是在一个单一的命令行使用管道,而不重定向到临时文件:
setopt > /tmp/foo; unsetopt >> /tmp/foo; set >> /tmp/foo; sort /tmp/foo
使用括号()的to将这些命令组合成一个单独的进程,这将连接每个进程的stdout。
实施例1(注意,$
是Shell提示符):
$ (echo zzz; echo aaa; echo kkk) | sort
aaa
kkk
zzz
实施例2:
(setopt; unsetopt; set) | sort
在Windows这将是如下:(echo zzz & echo aaa & echo kkk) | sort
或者,如果它在批处理文件中可以是单线(如样本)以及多线:
(
echo zzz
echo aaa
echo kkk
) | sort
注:原帖并没有提到它仅适用于Linux,所以我增加了对Windows命令行的解决方案......用VHD/VHDX工作时,里面的脚本DISKPART(echo diskpart_command
)它是非常有用的,而不是的回声相同,但让那里的echo
,也有另一种方式没有回声和>
重定向器,但它很容易出错和写得复杂得多(为什么使用复杂的容易出错的方式,如果存在一个简单的方法,总之工作得很好)...还记得%d%
给你实际的路径(非硬编码VHD/VHDX文件的路径非常有用)。
您可以使用{}
此,消除了一个子shell需要在(list)
,像这样:
{ echo zzz; echo aaa; echo kkk; } | sort
我们确实需要{
后}
前的空白字符。当序列写在一行上时,我们还需要最后的;
。
我们也可以把它写在多行,而不需要任何;
:
例1:
{
echo zzz
echo aaa
echo kkk
} | sort
例2:
{
setopt
unsetopt
set
} | sort
+1。你也可以使用不产生子外壳的大括号。语法有点严格:'{setopt; unsetopt;组; } |排序|更少“ - 需要围绕括号和尾部分号的空格。 – 2012-08-11 21:35:59
@glenn:这并不重要(在bash 3.2.48中测试过),因为流水线无论如何都强制它进入子shell。 – 2012-08-12 14:25:27
应该注意的是'$'是提示符,不是命令的一部分 – Gilly 2016-12-14 02:21:25