我需要在node.js函数
result = execSync('node -v');
它将同步执行给定的命令行并返回该命令文本的所有stdout。
ps.同步错误。我知道。仅供个人使用。
更新
现在我们有了mgutz的解决方案,它给出了退出代码,但没有stdout!还在等更确切的答案。
更新
Mgutz更新了他的答案,解决方案在这里:)
同样,作为dgo。一提到,有一个独立的模块execc -sync
更新2014-07-30
ShellJS lib到了。考虑到这是目前最好的选择。
更新2015-02-10
终于!NodeJS 0.12原生支持execSync。
查看官方文件
你可以在nodejs中执行同步shell操作,如下所示:
var execSync = function(cmd) {
var exec = require('child_process').exec;
var fs = require('fs');
//for linux use ; instead of &&
//execute your command followed by a simple echo
//to file to indicate process is finished
exec(cmd + " > c:\\stdout.txt && echo done > c:\\sync.txt");
while (true) {
//consider a timeout option to prevent infinite loop
//NOTE: this will max out your cpu too!
try {
var status = fs.readFileSync('c:\\sync.txt', 'utf8');
if (status.trim() == "done") {
var res = fs.readFileSync("c:\\stdout.txt", 'utf8');
fs.unlinkSync("c:\\stdout.txt"); //cleanup temp files
fs.unlinkSync("c:\\sync.txt");
return res;
}
} catch(e) { } //readFileSync will fail until file exists
}
};
//won't return anything, but will take 10 seconds to run
console.log(execSync("sleep 10"));
//assuming there are a lot of files and subdirectories,
//this too may take a while, use your own applicable file path
console.log(execSync("dir /s c:\\usr\\docs\\"));
编辑-本例适用于windows环境,如有必要可根据您自己的linux需求进行调整
我习惯于在回调函数的末尾实现“同步”的东西。不是很好,但是很有效。如果您需要实现一系列命令行执行,则需要将exec包装到某个命名函数中并递归调用它。
这个模式对我来说似乎很有用:
SeqOfExec(someParam);
function SeqOfExec(somepParam) {
// some stuff
// .....
// .....
var execStr = "yourExecString";
child_proc.exec(execStr, function (error, stdout, stderr) {
if (error != null) {
if (stdout) {
throw Error("Smth goes wrong" + error);
} else {
// consider that empty stdout causes
// creation of error object
}
}
// some stuff
// .....
// .....
// you also need some flag which will signal that you
// need to end loop
if (someFlag ) {
// your synch stuff after all execs
// here
// .....
} else {
SeqOfExec(someAnotherParam);
}
});
};