节点child_process.spawn多个命令

我想自动创build和提取密钥库。 我面临的问题是如何使用“ | ”来join命令 符号或类似的解决scheme。

//Original Command var command='keytool -exportcert -storepass mypass -keypass mypass -alias myalias -keystore mykey.keystore | openssl sha1 -binary | openssl base64'; //Arguments for the spawn var keyArgs = [ '-exportcert', '-storepass','mypass', '-keypass','mypass', '-alias','myalias', '-keystore',"myjey.keystore", 'openssl','sha1', '-binary', 'openssl','base64', ]; exec('keytool',keyArgs,{cwd:appCreateFolder+"/"+opt.id+"/Certificates"},function(e){ console.log(chalk.cyan('Key created')); }) 

从Node.js v6开始,你可以在spawn方法中指定一个shell选项,它将使用shell运行命令,因此可以使用spawn方法链接命令

比如这个:

 var spawn = require('child_process').spawn; var child = spawn('ls && ls && ls', { shell: true }); child.stderr.on('data', function (data) { console.error("STDERR:", data.toString()); }); child.stdout.on('data', function (data) { console.log("STDOUT:", data.toString()); }); child.on('exit', function (exitCode) { console.log("Child exited with code: " + exitCode); }); 

会在node.js版本小于6时触发错误:

 Error: spawn ls && ls && ls ENOENT 

但在版本6和更高版本上,它将返回预期的结果:

 node app.js STDOUT: app.js STDOUT: app.js app.js Child exited with code: 0 

| 命令行上的符号被称为“pipe道”,因为它就像pipe道数据stream在一起。 你想要的是为你正在执行的命令获取stdin (Standard In)和stdout (Standard Out)stream。

例如,你将如何产生echo命令并将其输出到grep:

 var spawn = require('child_process').spawn; var echo = spawn('echo', ['The quick brown fox\njumped over the lazy dog.']); var grep = spawn('grep', ['brown']); echo.stdout.pipe(grep.stdin); grep.stdout.pipe(process.stdin); 

上面的例子产生了“echo”和“grep”命令。 它将echo进程的stdoutstream的stdoutgrep进程的stdinstream。 最后,我们将grep进程的stdoutstream传stdout父进程的(你的节点进程) stdinstream,以便在terminal中看到输出。

输出将是“快速的棕色狐狸”,因为我在中间放了一个换行符,而grep只匹配了包含“棕色”的第一行。

您可以使用exec函数来实现相同的结果。 将来可能会更难维护,但如果您只需要快速运行一组pipe道命令,则可以input完整的命令行string(包括pipe道符号)并将其传递给exec

 var exec = require('child_process').exec; var cmdString = 'grep "The quick brown fox\njumped over the lazy dog." | grep "brown"'; exec(cmdString, (err, stdout, stderr) => { console.log(stdout); }); 

或者,如果您关心的是查看命令输出,则可以将输出传递给process.stdin而不是传入callback函数。

 exec(cmdString).stdout.pipe(process.stdin); 

下面是我相信你的代码应该看起来像使用spawn的一个简单的例子。 可能需要调整,因为它似乎特定于你在做什么。

 var keyArgs = [ '-exportcert', '-storepass','mypass', '-keypass','mypass', '-alias','myalias', '-keystore',"myjey.keystore", 'openssl','sha1', '-binary', 'openssl','base64', ]; var keyOpts = { cwd: `${appCreateFolder}/${opt.id}/Certificates` }; var spawn = require('child_process').spawn; var keytool = spawn('keytool', keyArgs, keyOpts); var opensslBinary = spawn('openssl', ['sha1', '-binary']); var opensslBase64 = spawn('openssl', ['base64']); keytool.stdout.pipe(opensslBinary.stdin); opensslBinary.stdout.pipe(opensslBase64.stdin); opensslBase64.stdout.pipe(process.stdin); opensslBase64.on('close', () => { console.log(chalk.cyan('Key created.')); }); 

或者使用exec

 var exec = require('child_process').exec; var cmdString = 'keytool -exportcert -storepass mypass -keypass mypass -alias myalias -keystore mykey.keystore | openssl sha1 -binary | openssl base64'; var cmdOpts = { cwd: `${appCreateFolder}/${opt.id}/Certificates` }; exec(cmdString, cmdOpts, () => { console.log(chalk.cyan('Key created.')); });