bash:在输出到stdout时不加改变地评估stdin

时间:2014-02-12 23:51:02

标签: bash

在bash中,我希望能够或多或少地分析stdin'带外',同时复制到stdout而不通过tmp文件,变量或明确命名为fifos。

两个类似的例子:

while read foo; do somefunc $foo; echo "$foo"; done

tee >(grep -qs bar && do_something_but_i_am_trapped_in_a_process_substitution_shell)
逐行不会成为世界末日,但我更喜欢更清洁的东西。

我希望能够做的事情是:exec,文件描述符重定向和tee,这样我可以做类似的事情:

hasABar=$(grep -qs bar <file descriptor magic> && echo yes || echo no)

...然后根据我是否有一个&#39;&#39;做一些事情,但最后,stdout仍然是stdin的副本。

更新:根据Kugelman在下面的回答,我适应了以下内容,这两项都有效。

(
    exec 3>&1
    myVar=$(tee /dev/fd/3 | grep -qs bar && echo yes || echo no) 
    #myVar=$(grep -qs bar <(tee /dev/fd/3) && echo yes || echo no)
    echo "$myVar" > /tmp/out1
)

1 个答案:

答案 0 :(得分:2)

您可以将stdout复制到fd 3,然后使用tee同时写入stdout和fd 3。

exec 3>&1
tee /dev/fd/3 | grep -qs bar

这是一个实际行动的例子。我加粗了我输入的线条。

$ cat test
#!/bin/bash
exec 3>&1
tee /dev/fd/3 | grep bar >&2

$ ./test | wc
foo
bar
bar
foo
^D
      3       3      12

了解grep barwc如何处理我的输入?我输入时grep找到了字符串“bar”,wc计算了我键入的所有内容。