nodejs spawn

Node.js 的子进程 (child_process) 模块下有一 spawn 函数,可以用于调用系统上的命令,如在 Linux, macOS 等系统上,我们可以执行如下代码来调用通用的 npm 命令。
在这里插入图片描述

const spawn = require('child_process').spawn;
spawn('npm', {
 stdio: 'inherit'
});

但是在windows上会报错
因为在 Windows 上,当我们执行 npm 时,我们实际执行的是 npm.cmd 批处理,而在 Windows 上, .cmd, .bat 批处理是无法脱离 cmd.exe 这一解释器而单独运行的。
此,我们需要显式地调用 cmd

spawn('cmd', ['/c', 'npm'], {
 stdio: 'inherit'
});

或者使用在调用 spawn 函数时,设置 shell 选项为 true 以隐式地调用 cmd

spawn('npm', {
 stdio: 'inherit',
 shell: true
});

另外,虽然在 Linux, macOS 等系统上不需要设置 shell 选项,命令也能够正常执行;设置 shell 为 true 也不会妨碍命令的执行,只是会额外的产生一个本不必要的 shell 进程,影响性能。因此,如果想要编写跨平台的 spawn 命令,而又不想增加额外的开销的话,可以这样写

const process = require('process');
const { spawn } = require('child_process');

spawn('npm', {
 stdio: 'inherit',
 // 仅在当前运行环境为 Windows 时,才使用 shell
 shell: process.platform === 'win32'
});

studio

在这里插入图片描述

  1. “pipe”:在子进程和父进程之间创建一个管道。管道的父端作为子进程对象subprocess.sdio[fd]上的属性公开给父级。为fds 0、1和2创建的管道也分别作为subprocess.stdin、subprocess.stdout和subprocess.sstderr提供。这些不是真正的Unix管道,因此子进程不能通过其描述符文件使用它们,例如/dev/fd/2或/dev/stdout。
  2. “overlapped”:与“管道”相同,只是在句柄上设置了FILE_FLAG_overlapped标志。这对于子进程的stdio句柄上的重叠I/O是必要的。有关更多详细信息,请参阅文档。这与非Windows系统上的“管道”完全相同。
  3. “ipc”:创建一个ipc通道,用于在父级和子级之间传递消息/文件描述符。ChildProcess最多可以有一个IPC stdio文件描述符。设置此选项可启用subprocess.send()方法。如果子进程是Node.js进程,IPC通道的存在将启用process.send()和process.disconnect()方法,以及子进程中的“disconnect”和“message”事件。
    不支持以除process.send()以外的任何方式访问IPC通道fd,或将IPC通道与非Node.js实例的子进程一起使用。
  4. ‘ignore’:指示Node.js忽略子级中的fd。虽然Node.js将始终为其生成的进程打开fds 0、1和2,但将fd设置为“忽略”将导致Node.js打开/dev/null并将其附加到子进程的fd。
  5. ‘inherit’:将相应的stdio流传递到父进程/从父进程传递。在前三个位置,这分别相当于process.stdin、process.stdout和process.stderr。在任何其他位置,相当于“忽略”。

官方API
https://nodejs.org/api/child_process.html#optionsstdio
参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

假装我不帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值