3

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

echo abcd | tr -d 'b'
tr -d 'b' <(echo abcd)

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

tr: extra operand '/dev/fd/63'

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

4

1 回答 1

5

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

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

tr -d b < <(echo abcd)
于 2013-02-18T17:23:43.680 回答