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

如何在Node.js的同一shell中通过execSync执行多条终端命令?

解决Node.js脚本中连续执行终端命令的问题

问题原因

每次调用spawnSync/execSync都会启动独立的子进程,cd这类仅影响当前shell环境的命令,只会作用于该子进程,无法改变后续子进程的工作目录,所以你执行的pwd还是会返回脚本的初始路径。

两种可行解决方案

方案1:给每个命令指定cwd参数(推荐)

直接在后续命令的选项中指定目标工作目录,这是最可控的方式,每个命令独立执行,便于错误排查和调试:

const path = require('path');
const cp = require('child_process');

// 定义仓库的目标路径
const targetRepoDir = path.resolve(__dirname, 'dir_name');

// 克隆仓库到指定目录(如需指定克隆后的目录名,可在git clone后追加目录名参数)
cp.execSync('git clone git@bitbucket.org<left blank>.git', {
    stdio: [0, 1, 2], // 继承父进程输入输出,便于查看克隆过程
    cwd: __dirname
});

// 执行pwd验证目录,指定cwd为仓库目录
const pwdResult = cp.spawnSync('pwd', [], { cwd: targetRepoDir });
console.log(`当前路径: ${pwdResult.stdout.toString().trim()}`);

// 执行构建命令,比如npm install、npm run build等
cp.execSync('npm install', {
    stdio: [0, 1, 2],
    cwd: targetRepoDir
});
cp.execSync('npm run build', {
    stdio: [0, 1, 2],
    cwd: targetRepoDir
});

方案2:在同一个shell中执行多条命令

将需要连续执行的命令用&&串联,通过开启shell: true让Node.js调用系统shell执行整个命令序列,模拟手动在终端输入的流程:

const cp = require('child_process');

// 用&&串联命令,确保前一个命令执行成功后才会执行下一个
cp.execSync('git clone git@bitbucket.org<left blank>.git && cd dir_name && pwd && npm install && npm run build', {
    stdio: [0, 1, 2],
    cwd: __dirname
});

// 或者用spawnSync,开启shell模式
const cmdSequence = cp.spawnSync('cd dir_name && pwd && npm install', {
    shell: true,
    stdio: [0, 1, 2],
    cwd: __dirname
});

注意事项

  • 如果克隆时目标目录已存在,git clone会报错,可添加--force参数强制覆盖,或者先通过fs.existsSync判断目录是否存在再做处理。
  • 调用spawnSync返回的stdout/stderr是Buffer对象,需要用toString()转换为字符串,再用trim()去除多余换行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 06:22:41