如何在nodejs里调用执行系统命令
所有的编程语言都有执行系统命令的接口,nodejs也不例外,比如删除调用shell命令,将一个HTML文件转换成PDF文件,如果是PHP,很简单:
<?php `prince -v builds/pdf/book.html -o builds/pdf/book.pdf`
在PHP里系统命令可以放在反单引号(`)里执行。如果你要是使用nodejs,你需要调用引用child_process
模块:
var exec = require('child_process').exec; var cmd = 'prince -v builds/pdf/book.html -o builds/pdf/book.pdf'; exec(cmd, function(error, stdout, stderr) { // 获取命令执行的输出 });
这里使用的是child_process.exec
来在nodejs程序里执行系统命令。如果你想在shell里执行命令并且要处理命令输出的I/O数据流,输出的体积比较大的话,我们需要使用child_process.spawn
:
var spawn = require('child_process').spawn; var child = spawn('prince', [ '-v', 'builds/pdf/book.html', '-o', 'builds/pdf/book.pdf' ]); child.stdout.on('data', function(chunk) { // output will be here in chunks }); // or if you want to send output elsewhere child.stdout.pipe(dest);
如果你想在nodejs里执行的是一个文件,而不是一个简单的命令,那你就需要使用 child_process.execFile
,这个方法的参数几乎和spawn
一样,只是多了第四个回调函数参数,和exec
里的回调函数参数一样:
var execFile = require('child_process').execFile; execFile(file, args, options, function(error, stdout, stderr) { // command output is in stdout });
上面的这些方法在nodejs里都是异步执行的,到但有时候我们需要同步执行一些任务,下面的一些代码例子是使用同步的方法调用系统命令执行任务:
'use strict'; const spawn = require( 'child_process' ).spawnSync, ls = spawn( 'ls', [ '-lh', '/usr' ] ); console.log( `stderr: ${ls.stderr.toString()}` ); console.log( `stdout: ${ls.stdout.toString()}` );
const execSync = require('child_process').execSync; var cmd = execSync('prince -v builds/pdf/book.html -o builds/pdf/book.pdf');