节点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
进程的stdout
stream的stdout
到grep
进程的stdin
stream。 最后,我们将grep
进程的stdout
stream传stdout
父进程的(你的节点进程) stdin
stream,以便在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.')); });