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

