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

如何将NPM脚本的返回结果传递给Bash脚本?

问题分析与解决方案

你的Bash脚本无法正常工作的核心原因是:wait $PID只会返回进程的退出状态码,不会捕获命令的标准输出。要实现需求,你需要直接捕获npm run update-imports的输出内容,而非通过后台运行+wait的方式。

修正后的Bash脚本

# 直接捕获npm脚本的标准输出,同时将stderr重定向到/dev/null避免干扰(可选)
UpdateResult=$(npm run update-imports 2>/dev/null)

# 判断输出是否为空
if [ -z "$UpdateResult" ]; then
    echo "No imports updated, committing changes"
else
    echo "Check the following files:"
    echo "$UpdateResult"
    exit 1
fi

关键说明

  1. 捕获输出的正确方式:使用$(command)语法直接捕获命令的标准输出到变量,这是Bash中获取命令输出的标准做法。
  2. stderr重定向:添加2>/dev/null是为了过滤npm本身的日志(比如"up to date, audited..."这类输出),如果需要保留错误信息可以去掉这部分。
  3. 换行输出优化:原脚本中echo "Check the following files:\n ${UpdateResult}"的\n在Bash默认环境下不会解析为换行,改为分两次echo更可靠。

额外优化(可选)

如果希望Node脚本的退出状态码也能配合Bash判断,可以在Node脚本中添加退出码设置:

#!/usr/bin/env node
import { main } from './main';
import { CONFIG } from '../config';

(async () => {
    const res = await main(CONFIG);
    process.stdout.write(res.join('\n'));
    // 根据结果是否为空设置退出码,非0表示有变更
    process.exitCode = res.length > 0 ? 1 : 0;
})();

此时Bash脚本可以同时结合输出内容和退出码判断,双重验证:

UpdateResult=$(npm run update-imports 2>/dev/null)
ExitCode=$?

if [ $ExitCode -eq 0 ] && [ -z "$UpdateResult" ]; then
    echo "No imports updated, committing changes"
else
    echo "Check the following files:"
    echo "$UpdateResult"
    exit 1
fi

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 09:40:36