将stdout传递给命令,该命令本身需要从自己的stdin中读取

时间:2017-04-01 20:57:40

标签: bash shell

我想将stdout从一个进程转换到另一个不使用stdin的进程,因为那个用于另一个目的。

简而言之,我想做到这样的事情:

echo  "a" >&4
cat | grep -f /dev/fd/4

我使用文件作为文件描述符4的源来运行它,但这不是我想要的:

# Variant 1
cat file | grep -f /dev/fd/4 4<pattern

# Variant 2
exec 4<pattern
cat | grep -f /dev/fd/4
exec 4<&-

我最好的尝试是,但我收到以下错误消息:

# Variant 3
cat | ( 
    echo  "a" >&4
    grep -f /dev/fd/4
) <&4 

错误讯息:

test.sh: line 5: 4: Bad file descriptor

实现这一目标的最佳方法是什么?

2 个答案:

答案 0 :(得分:4)

您无需使用多个流来执行此操作:

$ printf foo > pattern
$ printf '%s\n' foo bar | grep -f pattern
foo

如果要使用命令的输出作为-f的输入而不是静态文件,则可以使用process substitution

$ printf '%s\n' foo bar | grep -f <(echo foo)
foo

答案 1 :(得分:0)

对于缺少进程替换 POSIX shell,(例如dashashyash等。 )。

如果命令允许字符串输入,(grep允许它),并且包含搜索目标的输入字符串不是特别大(即字符串不超过length limit for the command line),那么总是command substitution

$ printf '%s\n' foo bar baz | grep $(echo foo)
foo

或者,如果输入文件是多行的,则将引用的搜索项与“ \ n ”分开的工作方式与grep {{1}相同}:

\|