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从文件描述符读取的命令。
小智 5
我发现Bash One-Liners Explained系列对于理解所有这些东西非常有用。
具体来说,上面链接的文章都是关于输入重定向的。
解决上面的具体例子:
> tr "o" "a" <<< $(echo "Foo")
Faa
Run Code Online (Sandbox Code Playgroud)