带输入重定向的进程替换

Ber*_*ard 8 bash io-redirection file-descriptors process-substitution

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

一个例子tr如下

$ tr "o" "a" <(echo "Foo")
tr: extra operand `/dev/fd/63'
Try `tr --help' for more information.
Run Code Online (Sandbox Code Playgroud)

我想我明白为什么这不起作用。进程替换<( )创建一个文件描述符,其中tr仅从标准输入读取。

我怎样才能让它在正确的重定向下工作?

我知道我可以简单地使用管道:

$ echo "Foo" | tr "o" "a"
Faa
Run Code Online (Sandbox Code Playgroud)

但是,我正在努力获得更好的理解。我尝试了一些东西的帮助下man bash,通过使用<&,但我真的不知道我在做什么。

如何正确使用进程替换tr

cha*_*aos 12

你真的很接近:

tr "o" "a" < <(echo "Foo")
Run Code Online (Sandbox Code Playgroud)

替换生成<()一个文件描述符并将路径粘贴到 shell。为了理解,只需执行:

<(echo blubb)
Run Code Online (Sandbox Code Playgroud)

你会看到错误:

-bash: /dev/fd/63: Permission denied
Run Code Online (Sandbox Code Playgroud)

这就是为什么它只是粘贴/dev/fd/63到外壳中并且/dev/fd/63不可执行,因为它是一个简单的管道。在tr上面的-example 中,它echo "Foo"是写入管道并通过输入重定向<它是tr从文件描述符读取的命令。

  • `ls -ld &lt;(echo blubb)` 可能是一个更好的说明。 (5认同)

小智 5

我发现Bash One-Liners Explained系列对于理解所有这些东西非常有用。

具体来说,上面链接的文章都是关于输入重定向的。

解决上面的具体例子:

> tr "o" "a" <<< $(echo "Foo")
Faa
Run Code Online (Sandbox Code Playgroud)

  • @伯纳德。它进行重定向。首先它在子shell中运行`echo Foo`,其输出重定向到管道。它从管道的另一端读取该输出并存储它(减去尾随的换行符)。一旦到达该管道上的 eof,它会根据 shell 对其进行分词,并将结果词与空格(`bash`)或不(zsh,ksh93)连接起来。然后将它和一个换行符存储到一个临时文件中。然后`tr` 输入从该临时文件重定向。 (3认同)