Bash 在管道中的同一位置收集命令

Bash 在管道中的同一位置收集命令,bash,pipe,Bash,Pipe,一个管道中的同一位置如何可以有多个命令(收集在一起)?i、 e.管道中的前一个命令分别顺序地输入到这些命令中的每个命令中,它们的组合输出输入到管道的下一个步骤中。例如,我如何对该管道进行一些修改 echo-e“1\n2\n3”{head-1;tail-1;}|xargs echo 打印13,而不是只打印1 谢谢 管道中的前一个命令将分别和顺序地馈送到这些命令中的每个命令中,它们的组合输出将馈送到管道的下一个步骤中 由于管道的性质,这是不可能的。从管道中读取数据后,数据将从管道中删除。这就是为什么

一个管道中的同一位置如何可以有多个命令(收集在一起)?i、 e.管道中的前一个命令分别顺序地输入到这些命令中的每个命令中,它们的组合输出输入到管道的下一个步骤中。例如,我如何对该管道进行一些修改

echo-e“1\n2\n3”{head-1;tail-1;}|xargs echo

打印
13
,而不是只打印
1

谢谢

管道中的前一个命令将分别和顺序地馈送到这些命令中的每个命令中,它们的组合输出将馈送到管道的下一个步骤中

由于管道的性质,这是不可能的。从管道中读取数据后,数据将从管道中删除。这就是为什么只有一个读卡器

我会将第一个命令的输出复制到一个临时文件中,然后将其馈送到两个命令
head
tail
。如果在子shell中启动
head
tail
,则可以将它们的组合输出提供给另一个命令:

顺便说一句,花括号之间的代码块不会启动子shell。你需要用括号。以下命令似乎最接近您所需的命令:

echo -e "1\n2\n3" > file.tmp ; ( head -1 file.tmp ; tail -qn1 file.tmp; rm file.tmp ) | next_command

关于特殊用例:打印文件的第一行和最后一行

为此,我将使用
sed

sed -n '1p;$p'
这将打印文件的第一行和最后一行。但是,它仅适用于包含至少两行的文件。如果文件包含一行,则会打印两次。您可以使用以下命令绕过此限制:

sed -n 'x;s/^/1/;x;1p;${x;/11/{x;p}}'

上面的命令在每行的保持缓冲区中添加一个
1
。在脚本末尾(可能在第一行之后),它检查保持缓冲区中是否至少有两行
1
,如果这是真的,则打印最后一行。

谢谢,这解决了我的特定需要(基本上就是给出的示例)但是没有回答更广泛的问题,所以我将保留这个问题。我为更广泛的问题添加了解释。的head_tail()函数显示了如何将其概括为从开始到结束的多行。是的,也可以使用函数。不过,它仍然需要将管道的内容保存到临时文件(或变量)中。实际上,该特定函数(与该页面上的其他函数不同)在管道中运行良好,没有临时文件。