有时,流程替换将无法按预期进行。这是一个例子:
输入:
gcc <(echo 'int main(){return 0;}')
输出:
/dev/fd/63: file not recognized: Illegal seek
collect2: error: ld returned 1 exit status
输入:
但是,当与其他命令一起使用时,它可以按预期工作:
grep main <(echo 'int main(){return 0;}')
输出:
int main(){return 0;}
我注意到其他命令也发生了类似的故障(即,期望来自进程替换的文件的命令无法使用/dev/fd/63
或类似)。这次故障gcc
只是最近一次。我是否应该确定一些通用规则来确定何时进程替换将以这种方式失败并且不应该使用?
我正在Ubuntu 12.04上使用此BASH版本(我也在arch和debian中也看到过):
GNU bash,版本4.3.11(1)-release(i686-pc-linux-gnu)
在这种特殊情况下,尽管gcc 可以接受标准输入,但它(默认情况下)使用文件扩展名来确定语言。因此,尝试
—
钢铁司机
gcc -xc <(echo 'int main(){return 0;}')
(将语言C
显式设置)。
我被引导到这里是为了回答我自己的问题,这可能是另一个例子。superuser.com/questions/1243405。感谢您比我更好地表述这个问题。
—
乔纳森·哈特利
illegal seek
貌似答案-在|pipe
这bash
点执行的程序是不是可搜索的文件。可能如果您无法成功echo data | command /dev/fd/0
完成某个程序,那么您将拥有类似的运气<(cmd)
。它不提供磁盘文件-只是替换了一个指向管道文件描述符的参数。