8

如何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.
4

4 回答 4

16

这是不可能的,因为 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

于 2013-01-21T08:47:35.153 回答
2

您可以使用 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
}
于 2020-11-17T18:58:56.123 回答
1

如果您想先使用cd,最好使用process.chdir('~/'). 然后单身exec()将完成这项工作。

于 2014-02-03T11:31:49.303 回答
0

您可以使用 cwd 参数调用 exec,如下所示:

exec('ls -a', {
    cwd: '/Users/user'
}, (err, stdout) => {
    if (err) {
        console.log(err);           
    } else {
        console.log(stdout);
    }
})

但请注意,cwd 不理解 '~'。您可以改用 process.env.HOME。

于 2017-09-07T15:45:23.417 回答