execSync中diff命令执行异常:文件不匹配时报错咨询
问题原因与解决办法
当文件内容不匹配时,diff在终端和exec方法里能正常返回差异结果,但用execSync执行就报错,核心是两者对命令退出码的处理逻辑不同:
diff的退出码规则:文件完全一致返回0,存在内容差异返回1,出现真正的错误(比如文件找不到)返回2。execSync默认会把退出码非0的情况直接当成异常抛出,所以文件有差异时(退出码1),它会触发报错,而非像exec那样正常返回结果。
另外你写的代码还有个明显问题:execSync执行成功时,只会返回stdout字符串(指定encoding的情况下),根本不会返回包含stdout、stderr、err的对象,所以那行解构代码本身就无法正常运行。
正确处理代码
用try/catch捕获异常,根据退出码区分是正常内容差异还是真正的命令错误:
const exec_options = { cwd : "/home" , encoding : 'utf8' }; try { // 文件内容一致时进入这里 const stdout = execSync(`diff output.txt answer.txt`, exec_options); console.log("文件内容完全一致"); console.log(stdout); } catch (err) { // 退出码1是diff正常返回内容差异,不属于错误 if (err.status === 1) { console.log("文件存在差异:"); console.log(err.stdout); } else { // 退出码≥2是真正的命令错误,比如文件不存在 console.error("diff命令执行出错:"); console.error(err.stderr); } }
补充说明
execSync抛出的异常对象中,status对应命令的退出码,stdout和stderr分别存储命令的标准输出与错误输出内容。
内容的提问来源于stack exchange,提问作者Vivek
相关产品推荐
相关产品推荐

