Bash进程替换因管道不可寻址报错,求可行解决办法
解决方法
进程替换<(...)生成的是匿名管道,这类流式设备不支持随机寻址(seek操作),而你的程序需要通过寻址来获取文件大小,所以必然会报illegal seek错误。如果不想手动管理临时文件,可以试试以下简化方案:
方案1:自动清理的临时文件(推荐)
用mktemp创建临时文件,同时通过trap在命令执行完成后自动删除临时文件,一行就能搞定:
temp_file=$(mktemp) && trap 'rm -f "$temp_file"' EXIT && echo "$data" > "$temp_file" && ./my_program --input-file "$temp_file"
不管程序执行成功还是失败,临时文件都会自动被删除,不会留下残留。
方案2:内存级临时文件(更快)
如果你的系统支持/dev/shm(大部分Linux发行版都默认开启),可以把临时文件放在内存中,读写速度会比磁盘文件快很多,同样自动清理:
temp_file=$(mktemp -p /dev/shm) && trap 'rm -f "$temp_file"' EXIT && echo "$data" > "$temp_file" && ./my_program --input-file "$temp_file"
为什么没有纯管道的替代方案?
不管是进程替换的匿名管道,还是用mkfifo创建的命名管道,本质都是流式传输,不支持lseek系统调用——而程序获取文件大小通常依赖fstat或者lseek到文件末尾再偏移回开头这类操作,这些在管道上都会直接失败,所以必须用真实文件来承载内容。
内容的提问来源于stack exchange,提问作者David Davidson
相关产品推荐
相关产品推荐

