【问题标题】:Split intermediate pipe to variable将中间管道拆分为变量
【发布时间】:2019-06-10 16:53:56
【问题描述】:

考虑下面的 toy 示例(我真正做的是更复杂),我想从相同的命令序列中获取两条信息:

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,尽管可以选择备用外壳。

【问题讨论】:

    标签: linux bash shell pipe


    【解决方案1】:

    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) 更适用于您的用例。

    【讨论】:

    • 这似乎挂在answer1=... 行,即使看起来p1 应该已经开放读写...如果我添加&amp; 到该行的末尾,它完成,但是answer1 显示为空。正在调查...
    • 我已经解决了,它按预期工作,谢谢。我认为某些东西仍在保持先进先出。为了给它鞠躬,你能修改你的答案来清理p1p2吗?
    猜你喜欢
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 2018-02-19
    • 2016-01-30
    • 2011-10-02
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    相关资源
    最近更新 更多