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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 18:14:53