进程替换 - tr 表示“额外操作数 /dev/fd/63”

evs*_*ith 3 bash process-substitution

我正在努力理解过程替换。据我所知,

echo abcd | tr -d 'b'
tr -d 'b' <(echo abcd)
Run Code Online (Sandbox Code Playgroud)

应该都给出相同的输出。但是第一个有效(输出为“acd”)但第二个说

tr: extra operand '/dev/fd/63'
Run Code Online (Sandbox Code Playgroud)

为什么是这样?tr 不只是通过管道接收 'abcd' 而不是 '/dev/fd/63' 吗?

rua*_*akh 5

进程替换的工作方式是,Bash 将替换<(echo abcd)为 (for example) /dev/fd/63,最常见的 *nix 实用程序会将其视为文件名并打开而不是标准输入。tr然而,这并不能接受一个文件名参数; 它不仅需要标准输入。

要传递<(echo abcd)标准输入的结果,您可以使用另一个<

tr -d b < <(echo abcd)
Run Code Online (Sandbox Code Playgroud)