Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 将多个命令管道化为单个命令_Bash_Shell_Process_Pipe_Subshell - Fatal编程技术网

Bash 将多个命令管道化为单个命令

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 使用括号()将命令组合成一个进程,该进程将

如何将多个命令的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
使用括号()将命令组合成一个进程,该进程将连接每个命令的标准输出

示例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可能不同)。