如何exec
连续?例如ls
之后的cd
?
我试过
exec = require('child_process').exec;
exec('cd ~/',
function(){
exec('ls'),
function(err, stdout, stderr){
console.log(stdout); // this logs current dir but not ~/'s
}
}
)
exec('cd ~/').exec('ls', function(err, stdout, stderr){
console.log(stdout);
})//this also fails because first exec returns a ChildProcess Object but not itself.
答案 0 :(得分:10)
不可能这样做,因为exec和spawn会创建一个新进程。但有一种方法可以模拟这一点。您可以使用exec启动进程并在同一时间执行多个命令: 如果要在同一行上执行3个命令,请在命令行中编写:
cmd1 & cmd2 & cmd3
因此,所有3个命令都在同一进程中运行,并且可以访问先前执行的命令修改的上下文。 让我们举个例子,你想执行cd ../然后执行dir并查看以前的目录列表。 在cmd中你应该写:
cd../ & dir
从节点js,您可以使用exec启动进程并告诉它启动另一个将评估内联脚本的节点实例:
var exec = require('child_process').exec;
var script = "var exec = require('child_process').exec;exec('dir',function(e,d,er){console.log(d);});";
script = '"'+script+'"';//enclose the inline script with "" because it contains spaces
var cmd2 = 'node -e '+script;
var cd = exec('cd ../ &'+cmd2,function(err,stdout,strerr)
{
console.log(stdout);//this would work
})
如果您只想更改当前目录,请查看相关文档http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback
答案 1 :(得分:1)
您可以使用nodejs promisify和async / await:
const { promisify } = require('util');
const exec = promisify(require('child_process').exec);
export default async function () {
const cpu = await exec('top -bn1');
const disk = await exec('df -h');
const memory = await exec('free -m');
const payload = {
cpu,
disk,
memory,
};
return payload
}
答案 2 :(得分:0)
如果您想先使用cd
,请更好地使用process.chdir('~/')
。然后单exec()
将完成这项工作。
答案 3 :(得分:0)
您可以像cwd param一样调用exec:
exec('ls -a', {
cwd: '/Users/user'
}, (err, stdout) => {
if (err) {
console.log(err);
} else {
console.log(stdout);
}
})
但要注意,cwd不理解'〜'。您可以改用process.env.HOME。