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' 吗?
进程替换的工作方式是,Bash 将替换<(echo abcd)为 (for example) /dev/fd/63,最常见的 *nix 实用程序会将其视为文件名并打开而不是标准输入。tr然而,这并不能接受一个文件名参数; 它不仅需要标准输入。
要传递<(echo abcd)标准输入的结果,您可以使用另一个<:
tr -d b < <(echo abcd)
Run Code Online (Sandbox Code Playgroud)