将中间管道拆分为变量

时间:2019-06-10 16:53:56

标签: linux bash shell pipe

考虑下面的玩具示例(我实际上在做的事情更复杂),在该示例中,我想从相同的命令序列中获得两条信息:

echo 'cats pajamas
hatori hanso
batterang
catwoman
fratstar' > tmp1

answer1=$(grep 'cat' tmp1)
answer2=$(grep 'cat' tmp1 | wc -l)

从本质上讲,我正在寻找一种方法,该方法只需要按顺序运行较早的命令(在本例中为grep)一次,而仍能准确获得 存储在变量answer1answer2中的相同值。我想这可以将管道(可以说)拆分为answer1wc -l,而后者的输出将进入answer2

请注意,使用间歇变量或文件存储grep的输出将更改wc -l返回的内容。我认为,这激发了我对这个玩具示例的选择,并限制了this的相关性。 This question看起来是相关的,但是我不清楚如何将中间部分分配给另一个变量。我目前在bash中,尽管可以选择使用其他shell。

1 个答案:

答案 0 :(得分:2)

tee与一对命名管道一起使用。 (严格来说,您可以使用一个管道和grep本身的标准输出来执行此操作,但是使用两个管道可以简化演示。)

mkfifo p1 p2
grep cat tmp1 | tee p1 p2 > /dev/null &
answer1=$(cat p1)
answer2=$(wc -l < p2)

tee随心所欲地分割输出,将其写入两个单独的管道中,然后由catwc -l独立读取。

我认为这比answer1=$(grep 'cat' tmp1)answer2=$(echo "$answer1" | wc -l)更适用于您的用例。