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

Node.js exec执行diff命令异常:文件不同时报错、相同时无输出

Node.js exec执行diff命令无法获取差异内容的问题解决

问题情况

我需要通过Node.js完成以下流程:编译C++文件 → 运行程序生成输出 → 将输出与answer.txt比对差异。

  • 在终端直接执行命令时:文件内容一致则无输出,不一致时会显示首次出现差异的行。
  • 用Node.js的exec方法执行时:内容一致表现正常,但内容不一致时会触发命令执行失败的error回调,无法获取到差异内容。

原代码如下:

exec(
    `cd ${dirprob} && g++ ${job.filepath} -o testprogram && ./testprogram <input.txt >output.txt && diff output.txt answer.txt ` , 
    
    (error,stdout , stderr)=>{
        if (error) {
            
            return ;
        }
        if (stderr) {
            console.log(`stderr: ${stderr}`);
            return ;
        }
        console.log(`stdout: ${stdout}`);
        return ;
    })

问题原因

diff命令的退出码规则是:

  • 0:两个文件内容一致
  • 1:两个文件内容存在差异
  • 2:出现错误(如文件不存在)

Node.js的exec方法会将非0退出码都视为命令执行错误,触发error回调。当文件内容不同时,diff返回1,被exec判定为错误,导致无法获取到输出在stdout里的差异内容。

解决方法

修改回调逻辑,区分diff的退出码:

  • 当error存在且error.code === 1:这是正常的差异情况,直接读取stdout的内容即可
  • 当error.code === 2:才是真正的命令执行错误,需要处理
  • 无error时,说明文件内容一致

修改后的代码示例:

exec(
    `cd ${dirprob} && g++ ${job.filepath} -o testprogram && ./testprogram <input.txt >output.txt && diff output.txt answer.txt`,
    (error, stdout, stderr) => {
        // 处理diff返回1的情况(内容有差异)
        if (error && error.code === 1) {
            console.log(`差异内容:${stdout}`);
            return;
        }
        // 处理真正的命令错误(如编译失败、文件不存在等)
        if (error) {
            console.log(`命令执行错误:${error.message}`);
            return;
        }
        if (stderr) {
            console.log(`错误输出:${stderr}`);
            return;
        }
        // 无输出说明内容一致
        console.log("文件内容一致");
    }
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:43:32