使用输入重定向进行进程替换

使用输入重定向进行进程替换

我试图理解输入重定向与进程替换的结合。我正在使用bash3

一个例子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

相关内容