You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash脚本中获取并使用Node.js脚本的stdout输出?

Node.js输出内容管道传递给Bash脚本的正确实现方案

报错原因

你遇到的问题由两个逻辑偏差共同导致:

  • 你当前的Bash脚本中echo $1读取的是命令行位置参数,而非管道传递的标准输入(stdin) 内容。脚本执行时没有传入位置参数,echo $1执行完成后进程直接退出,导致管道下游提前关闭,上游Node.js尝试向已关闭的管道写入数据时就触发了Error: write EPIPE报错。
  • node myapp | grep 'www'能正常运行,是因为grep会持续读取标准输入直到EOF,不会提前关闭管道,所以Node.js的写入操作不会触发异常。

正确实现方式

方式1:Bash逐行读取管道输入(适合输出多个URL的场景)

如果Node.js脚本会输出多个URL(每行1个),直接修改Bash脚本读取标准输入即可:

#!/bin/bash
# 逐行读取标准输入内容赋值给url变量
while read -r url; do
  # 此处替换为你需要执行的curl等逻辑
  echo "当前处理URL:$url"
  curl -I "$url"
done

执行命令保持原有写法即可:
node myapp | bash mybash

方式2:命令替换传参(适合输出单个URL的场景)

如果Node.js仅输出单个URL,也可以直接将Node.js输出作为位置参数传给Bash脚本,无需修改你原有Bash的echo $1逻辑:

# 原有mybash脚本无需调整
#!/bin/bash
echo "接收到的URL:$1"
curl -I "$1"

执行命令调整为命令替换的写法:
bash mybash "$(node myapp)"

可选优化:Node.js侧兼容EPIPE异常

如果希望保留管道写法的同时避免Node.js抛错,可以在Node.js脚本中添加EPIPE错误处理逻辑:

// 放在Node.js脚本开头即可
process.stdout.on('error', (err) => {
  if (err.code === 'EPIPE') process.exit(0);
  throw err;
});

内容的提问来源于stack exchange,提问作者AKIRK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 00:57:04