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
相关产品推荐
相关产品推荐

