考虑下面的玩具示例(我实际上在做的事情更复杂),在该示例中,我想从相同的命令序列中获得两条信息:
echo 'cats pajamas
hatori hanso
batterang
catwoman
fratstar' > tmp1
answer1=$(grep 'cat' tmp1)
answer2=$(grep 'cat' tmp1 | wc -l)
从本质上讲,我正在寻找一种方法,该方法只需要按顺序运行较早的命令(在本例中为grep
)一次,而仍能准确获得 存储在变量answer1
和answer2
中的相同值。我想这可以将管道(可以说)拆分为answer1
和wc -l
,而后者的输出将进入answer2
。
请注意,使用间歇变量或文件存储grep
的输出将更改wc -l
返回的内容。我认为,这激发了我对这个玩具示例的选择,并限制了this的相关性。 This question看起来是相关的,但是我不清楚如何将中间部分分配给另一个变量。我目前在bash
中,尽管可以选择使用其他shell。
答案 0 :(得分:2)
将tee
与一对命名管道一起使用。 (严格来说,您可以使用一个管道和grep
本身的标准输出来执行此操作,但是使用两个管道可以简化演示。)
mkfifo p1 p2
grep cat tmp1 | tee p1 p2 > /dev/null &
answer1=$(cat p1)
answer2=$(wc -l < p2)
tee
随心所欲地分割输出,将其写入两个单独的管道中,然后由cat
和wc -l
独立读取。
我认为这比answer1=$(grep 'cat' tmp1)
和answer2=$(echo "$answer1" | wc -l)
更适用于您的用例。