我试图理解输入重定向与进程替换的结合。我正在使用bash
3
一个例子tr
如下
$ tr "o" "a" <(echo "Foo")
tr: extra operand `/dev/fd/63'
Try `tr --help' for more information.
我想我明白为什么这不起作用。进程替换<( )
创建一个文件描述符,其中tr
仅从标准输入读取。
我怎样才能让它通过正确的重定向来工作?
我知道我可以简单地使用管道:
$ echo "Foo" | tr "o" "a"
Faa
不过,我正在努力获得更好的理解。我在man bash
, 通过使用 的帮助下尝试了一些东西<&
,但我真的不知道我在做什么。
如何正确使用进程替换tr
?
答案1
你们真的很接近:
tr "o" "a" < <(echo "Foo")
替换<()
会生成一个文件描述符,并将路径粘贴到 shell。为了便于理解,只需执行:
<(echo blubb)
你会看到错误:
-bash: /dev/fd/63: Permission denied
这就是为什么它只是粘贴/dev/fd/63
到外壳中并且/dev/fd/63
不可执行,因为它是一个简单的管道。在tr
上面的示例中,它是echo "Foo"
写入管道的命令,并通过输入重定向从文件描述符读取的命令<
。tr
答案2
我找到了Bash 俏皮话解释系列对于更多地了解所有这些东西非常有用。
具体来说,上面链接的文章都是关于输入重定向的。
解决上面的具体例子:
> tr "o" "a" <<< $(echo "Foo")
Faa