Linux环境下Node.js执行/dev/stdin报错的问题求助
解决Node.js执行
node /dev/stdin管道报错的问题 问题重现
执行以下命令时出现ENOENT错误:
printf 'console.log(1)' | node /dev/stdin
报错信息:
node:fs:453 return binding.readFileUtf8(path, stringToFlags(options.flag)); ^ Error: ENOENT: no such file or directory, open '/proc/2513530/fd/pipe:[611889]'
但Python、tcc执行类似命令可正常运行:
printf 'print("hi")' | python /dev/stdin printf 'int main(){ puts("111");return 0;}' | tcc -run /dev/stdin
环境:Linux,Node.js v22.5.1
解决方法
方法1:使用node -读取标准输入
Node.js支持用-作为参数,表示直接从标准输入读取代码执行,这是官方推荐的处理管道输入的方式:
printf 'console.log(1)' | node -
方法2:使用进程替换重定向输入
通过Bash的进程替换将输出直接重定向到Node的标准输入:
node < <(printf 'console.log(1)')
原因说明
Node.js处理/dev/stdin时,会尝试解析该符号链接对应的实际文件路径(比如/proc/self/fd/0),但当输入是管道时,这个路径指向的是/proc/[pid]/fd/pipe:[xxx]这类临时管道项,而Node的文件读取机制在处理这种管道文件时,可能因为管道的生命周期或权限问题,无法正确打开对应的路径。
而Python、tcc等工具在处理/dev/stdin时,会直接读取标准输入流的内容,不会尝试解析路径对应的实际文件,因此可以正常运行。node -则是Node专门设计的、直接读取stdin流的方式,避开了路径解析的问题。
内容的提问来源于stack exchange,提问作者AsukaMinato
相关产品推荐
相关产品推荐

