Node.js中使用&&运算符执行两条命令报错问题求助
问题
在Mac终端执行cd ./tools/darwin/ && ./adb可正常运行,但在Node.js应用中通过以下代码执行该组合命令时报错:
const CHANGE_DIRECTORY_COMMAND = "cd ./tools/darwin/" const EXECUTE_ADB_COMMAND = "./adb" if(platform === "darwin") { exec(`${CHANGE_DIRECTORY_COMMAND} && ${EXECUTE_ADB_COMMAND}`, (error, stdout, stderr) => { if (error) { console.error(`Error executing the adb file: ${error}`); return; } if (stdout) { console.log(`Standard output: ${stdout}`); } if (stderr) { console.error(`Standard error: ${stderr}`); } }); }
报错信息:Error executing the adb file: Error: Command failed: cd ./tools/darwin/ && ./adb
另外,执行如下组合命令的Node.js代码可正常运行:
const { exec } = require("child_process"); let commandOne = "ls -l"; // 以长格式显示当前目录所有文件 let commandTwo = "whoami"; // 打印当前用户 let commandThree = "pwd"; // 打印当前目录名称 exec(`${commandOne} && ${commandTwo} && ${commandThree}`, (error, stdout, stderr) => { if (error) { console.log(`error: ${error.message}`); return; } if (stderr) { console.log(`stderr: ${stderr}`); return; } console.log(`Output: ${stdout}`); });
原因分析
- 工作目录不匹配:Node.js的
exec执行命令时,默认工作目录是Node进程的启动目录,而非代码文件所在目录。终端中cd的相对路径基于终端当前目录,但Node进程的启动目录可能与终端不同,导致cd到错误路径,后续找不到./adb文件。 - 相对路径歧义:
./tools/darwin/的相对路径依赖进程启动目录,若启动目录不是项目根目录,该路径会指向不存在的位置,触发命令执行失败。
解决方案
方法1:指定exec的cwd参数(推荐)
直接通过exec的选项参数指定命令执行的工作目录,无需cd命令,避免路径歧义:
const { exec } = require("child_process"); const EXECUTE_ADB_COMMAND = "./adb"; if (platform === "darwin") { exec(EXECUTE_ADB_COMMAND, { cwd: "./tools/darwin/" }, (error, stdout, stderr) => { if (error) { console.error(`执行adb文件出错: ${error}`); return; } if (stdout) { console.log(`标准输出: ${stdout}`); } if (stderr) { console.error(`标准错误: ${stderr}`); } }); }
说明:cwd参数会让exec在指定目录下执行命令,确保./adb能被正确找到。
方法2:使用绝对路径
通过Node.js的path模块生成adb文件的绝对路径,彻底避免相对路径问题:
const { exec } = require("child_process"); const path = require("path"); // 生成adb文件的绝对路径,__dirname为当前代码文件所在目录 const adbAbsolutePath = path.resolve(__dirname, "./tools/darwin/adb"); if (platform === "darwin") { exec(adbAbsolutePath, (error, stdout, stderr) => { if (error) { console.error(`执行adb文件出错: ${error}`); return; } if (stdout) { console.log(`标准输出: ${stdout}`); } if (stderr) { console.error(`标准错误: ${stderr}`); } }); }
说明:path.resolve会将相对路径转换为绝对路径,无论Node进程从哪里启动,都能精准定位到adb文件。
方法3:确认并修正工作目录
如果坚持使用cd命令,先确认Node进程的当前工作目录,再调整相对路径:
// 先打印当前工作目录,确认路径是否正确 exec("pwd", (error, stdout) => { console.log("Node进程当前工作目录:", stdout.trim()); });
根据打印的目录结果,调整cd命令的相对路径,确保能正确进入tools/darwin目录。
内容的提问来源于stack exchange,提问作者Caner Tüysüz
相关产品推荐
相关产品推荐

