阿西河

所有教程

公众号
🌙
阿西河前端的公众号

我的收藏

    最近访问  (文章)

      教程列表

      抓包专区
      测试专区

      Node.js child_process.exec

      Node.js child_process.exec(command[, options][, callback]) 版本历史

      版本变更
      v8.8.0The windowsHide option is supported now.
      v0.1.90新增于: v0.1.90
      • command < string> 要运行的命令,并带上以空格分隔的参数。
      • options < Object>
        • cwd < string> 子进程的当前工作目录。默认值: null。
        • env < Object> 环境变量的键值对。默认值: null。
        • encoding < string> 默认值: ‘utf8’。
        • shell < string> 用于执行命令的 shell。参阅 shell 的要求与 Windows 默认的 shell。 默认值: UNIX 上是 ‘/bin/sh’,Windows 上是 process.env.ComSpec。
        • timeout < number> 默认值: 0。
        • maxBuffer < number> stdout 或 stderr 上允许的最大字节数。如果超过限制,则子进程将终止。参阅 maxBuffer 与 Unicode。默认值: 200 * 1024。
        • killSignal < string> | < integer> 默认值: ‘SIGTERM’。
        • uid < number> 设置进程的用户标识,参阅 setuid(2)。
        • gid < number> 设置进程的群组标识,参阅 setgid(2)。
        • windowsHide < boolean> 隐藏通常在 Windows 系统上创建的子进程的控制台窗口。默认值: false。
      • callback < Function> 当进程终止时调用。
        • error < Error>
        • stdout < string> | < Buffer>
        • stderr < string> | < Buffer>
      • 返回: < ChildProcess>

      衍生一个 shell 然后在该 shell 中执行 command,并缓冲产生的输出。 传给 exec 函数的 command 字符串由 shell 直接处理,特殊字符(因 shell 而异)需要相应地处理:

      exec('"/path/to/test file/test.sh" arg1 arg2');
      // 使用双引号,以便路径中的空格不被解析为多个参数。
      
      exec('echo "The \\$HOME variable is $HOME"');
      // 第一个 $HOME 会被转义,第二个则不会。
      

      切勿将未经过处理的用户输入传给此函数。 包含 shell 元字符的任何输入都可用于触发任意命令执行。

      如果提供了 callback,则调用时传入参数 (error, stdout, stderr)。 当成功时,则 error 将为 null。 当出错时,则 error 将是 Error 的实例。 error.code 属性是子进程的退出码, error.signal 是终止进程的信号。 除 0 以外的任何退出码都被视为出错。

      传给回调的 stdout 和 stderr 参数包含子进程的 stdout 和 stderr 输出。 默认情况下,Node.js 会将输出解码为 UTF-8 并将字符串传给回调。 encoding 选项可用于指定用于解码 stdout 和 stderr 输出的字符编码。 如果 encoding 是 ‘buffer’ 或无法识别的字符编码,则传给回调的将会是 Buffer 对象。

      const { exec } = require('child_process');
      exec('cat *.js missing_file | wc -l', (error, stdout, stderr) => {
        if (error) {
          console.error(`执行出错: ${error}`);
          return;
        }
        console.log(`stdout: ${stdout}`);
        console.log(`stderr: ${stderr}`);
      });
      

      如果 timeout 大于 0,则当子进程运行时间超过 timeout 毫秒时,父进程将发送带 killSignal 属性(默认为 ‘SIGTERM’)的信号。

      与 exec(3) 的 POSIX 系统调用不同, child_process.exec() 不替换现有的进程,且使用 shell 来执行命令。

      如果调用此方法的 util.promisify() 版本,则返回的 Promise 会返回具有 stdout 属性和 stderr 属性的 Object。 如果出现错误(包括导致退出码不是 0 的任何错误),则返回被拒绝的 Promise,并在回调中给定相同的 error 对象,但是还有另外两个属性 stdout 和 stderr。

      const util = require('util');
      const exec = util.promisify(require('child_process').exec);
      
      async function lsExample() {
        const { stdout, stderr } = await exec('ls');
        console.log('stdout:', stdout);
        console.log('stderr:', stderr);
      }
      lsExample();
      

      更多内容请参考:Node.js child_process 子进程,或者通过 点击对应菜单 进行查看;


      目录
      本文目录
      目录