在node.js中,我想找到一种获取Unix终端命令输出的方法。有没有办法做到这一点?
function getCommandOutput(commandString){
// now how can I implement this function?
// getCommandOutput("ls") should print the terminal output of the shell command "ls"
}
答案 0 :(得分:108)
这就是我在我现在正在工作的项目中的方式。
var exec = require('child_process').exec;
function execute(command, callback){
exec(command, function(error, stdout, stderr){ callback(stdout); });
};
示例:检索git用户
module.exports.getGitUser = function(callback){
execute("git config --global user.name", function(name){
execute("git config --global user.email", function(email){
callback({ name: name.replace("\n", ""), email: email.replace("\n", "") });
});
});
};
答案 1 :(得分:23)
您正在寻找child_process
var exec = require('child_process').exec;
var child;
child = exec(command,
function (error, stdout, stderr) {
console.log('stdout: ' + stdout);
console.log('stderr: ' + stderr);
if (error !== null) {
console.log('exec error: ' + error);
}
});
正如Renato指出的那样,现在也有一些同步的exec包,请参阅sync-exec,这可能更像是你在寻找的东西。请记住,node.js设计为单线程高性能网络服务器,所以如果你想要使用它,请远离sync-exec类似的东西,除非你只是在启动时使用它什么的。
答案 2 :(得分:16)
如果您使用的是晚于7.6的节点并且您不喜欢回调样式,则还可以使用node-util的promisify
函数和async / await
来实现获取干净地读取的shell命令。以下是使用此技术接受的答案的示例:
const { promisify } = require('util');
const exec = promisify(require('child_process').exec)
module.exports.getGitUser = async function getGitUser () {
const name = await exec('git config --global user.name')
const email = await exec('git config --global user.email')
return { name, email }
};
这还有一个额外的好处,即在失败的命令上返回被拒绝的承诺,可以在异步代码中使用try / catch
处理。
答案 3 :(得分:8)
感谢Renato的回答,我创建了一个非常基本的示例:
const exec = require('child_process').exec
exec('git config --global user.name', (err, stdout, stderr) => console.log(stdout))
它只会打印您的全局git用户名:)
答案 4 :(得分:4)
这将需要Node.js 7或更高版本,并支持Promises和Async / Await。
创建一个包装函数,该函数利用承诺来控制child_process.exec
命令的行为。
使用Promise和异步函数,您可以模仿shell返回输出的行为,而不会陷入回调地狱,并且具有漂亮的API。使用await
关键字,您可以创建一个易于阅读的脚本,同时仍然能够完成child_process.exec
的工作。
const childProcess = require("child_process");
/**
* @param {string} command A shell command to execute
* @return {Promise<string>} A promise that resolve to the output of the shell command, or an error
* @example const output = await execute("ls -alh");
*/
function execute(command) {
/**
* @param {Function} resolve A function that resolves the promise
* @param {Function} reject A function that fails the promise
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
*/
return new Promise(function(resolve, reject) {
/**
* @param {Error} error An error triggered during the execution of the childProcess.exec command
* @param {string|Buffer} standardOutput The result of the shell command execution
* @param {string|Buffer} standardError The error resulting of the shell command execution
* @see https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback
*/
childProcess.exec(command, function(error, standardOutput, standardError) {
if (error) {
reject();
return;
}
if (standardError) {
reject(standardError);
return;
}
resolve(standardOutput);
});
});
}
async function main() {
try {
const passwdContent = await execute("cat /etc/passwd");
console.log(passwdContent);
} catch (error) {
console.error(error.toString());
}
try {
const shadowContent = await execute("cat /etc/shadow");
console.log(shadowContent);
} catch (error) {
console.error(error.toString());
}
}
main();
root:x:0:0::/root:/bin/bash
[output trimmed, bottom line it succeeded]
Error: Command failed: cat /etc/shadow
cat: /etc/shadow: Permission denied
答案 5 :(得分:1)
您可以使用 nodejs 附带的 util 库从 exec 命令获取承诺,并可以根据需要使用该输出。使用重组将 stdout 和 stderr 存储在变量中。
const util = require('util');
const exec = util.promisify(require('child_process').exec);
async function lsExample() {
const {
stdout,
stderr
} = await exec('ls');
console.log('stdout:', stdout);
console.error('stderr:', stderr);
}
lsExample();
答案 6 :(得分:0)
您可以使用 ShellJS
包。
ShellJS 是基于 Node.js API 的 Unix shell 命令的可移植 (Windows/Linux/OS X) 实现。
见:https://www.npmjs.com/package/shelljs#execcommand--options--callback
import * as shell from "shelljs";
//usage:
//exec(command [, options] [, callback])
//example:
const version = shell.exec("node --version", {async: false}).stdout;
console.log("nodejs version", version);