命令行上的| 符号称为“管道”,因为它就像将数据流管道连接在一起。您想要的是获取您正在执行的命令的stdin(标准输入)和stdout(标准输出)流。
例如,这是生成 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 流的任何输出通过管道传输到grep 进程的stdin 流。最后,我们将grep 进程的stdout 流通过管道传输到父进程(您的节点进程)的stdin 流,以便您可以在终端中看到输出。
输出将是“The quick brown fox”,因为我在中间放了一个换行符,而 grep 只匹配包含“brown”的第一行。
您可以使用exec 函数来获得相同的结果。只是将来可能更难维护,但如果您只需要快速运行一组管道命令,您可以输入完整的命令行字符串(包括管道符号)并将其传递给 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,而不是传递回调函数。
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.'));
});