我想将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
实现这一目标的最佳方法是什么?
答案 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,(例如dash
,ash
,yash
,等。 )。
如果命令允许字符串输入,(grep
允许它),并且包含搜索目标的输入字符串不是特别大(即字符串不超过length limit for the command line),那么总是command substitution:
$ printf '%s\n' foo bar baz | grep $(echo foo)
foo
或者,如果输入文件是多行的,则将引用的搜索项与“ \ n ”分开的工作方式与grep
或 {{1}相同}:
\|