产生一个 shell 来执行一个命令
要在 shell 中运行命令,你需要缓冲输出(即它不是流),请使用 child_process.exec
。例如,如果你想运行命令 cat *.js file | wc -l
,没有选项,那将是这样的:
const exec = require('child_process').exec;
exec('cat *.js file | wc -l', (err, stdout, stderr) => {
if (err) {
console.error(`exec error: ${err}`);
return;
}
console.log(`stdout: ${stdout}`);
console.log(`stderr: ${stderr}`);
});
该函数最多接受三个参数:
child_process.exec(command[, options][, callback]);
command 参数是一个字符串,是必需的,而 options 对象和 callback 都是可选的。如果未指定选项对象,则 exec
将使用以下默认值:
{
encoding: 'utf8',
timeout: 0,
maxBuffer: 200*1024,
killSignal: 'SIGTERM',
cwd: null,
env: null
}
options 对象还支持 shell
参数,默认情况下为 UNIX 上的/bin/sh
和 Windows 上的 cmd.exe
,用于设置进程用户身份的 uid
选项,以及用于组标识的 gid
选项。
使用三个参数 (err, stdout, stderr)
调用在命令执行完成时调用的回调。如果命令成功执行,则 err
将为 null
,否则它将是 Error
的实例,其中 err.code
是进程的退出代码,err.signal
是发送以终止它的信号。
stdout
和 stderr
参数是命令的输出。它使用 options 对象中指定的编码进行解码(默认值:string
),但也可以作为 Buffer
对象返回。
还有 exec
的同步版本,即 execSync
。同步版本不接受回调,并将返回 stdout
而不是 ChildProcess
的实例。如果同步版本遇到错误,它会引发和终止程序。它看起来像这样:
const execSync = require('child_process').execSync;
const stdout = execSync('cat *.js file | wc -l');
console.log(`stdout: ${stdout}`);