bash:在输出到 stdout 时评估 stdin



在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)

。然后根据我是否有"酒吧"做一些事情,但最终,stdout 仍然是 stdind 的副本。

更新:从库格尔曼下面的回答中,我适应了以下内容,两者都有效。

(
    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
)

你可以将标准输出复制到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如何处理我的输入? 当我输入字符串"bar"时,grep找到了它,wc计算了我输入的所有内容。

相关内容

  • 没有找到相关文章

最新更新