nodeJS exec对“cd”shell cmd不起作用

var sys = require('sys'), exec = require('child_process').exec; exec("cd /home/ubuntu/distro", function(err, stdout, stderr) { console.log("cd: " + err + " : " + stdout); exec("pwd", function(err, stdout, stderr) { console.log("pwd: " + err + " : " + stdout); exec("git status", function(err, stdout, stderr) { console.log("git status returned " ); console.log(err); }) }) }) 

 cd: null : pwd: null : / git status returned { [Error: Command failed: fatal: Not a git repository (or any of the parent directories): .git ] killed: false, code: 128, signal: null } 

nodeJS exec对“cd”shell cmd不起作用。 正如你在下面看到的,pwd工作,git status正在尝试工作,但因为它不在git目录中执行而失败,但cd cmd无法停止进一步成功执行其他cmd。 尝试在nodeJSshell以及nodeJS + ExpressJSnetworking服务器。

每个命令都在一个单独的shell中执行,所以第一个cd只影响那个终止的shell进程。 如果你想在特定的目录下运行git ,只需让Node为你设置path:

 exec('git status', {cwd: '/home/ubuntu/distro'}, /* ... */); 

cwd (当前工作目录)是可用于exec的许多选项之一 。

这是工作。 但是,这是把壳扔掉。 Node为每个exec创build一个新的shell。

以下是可以提供帮助的选项: http : //nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback

而不是多次调用exec()。 为多个命令调用exec()一次

你的shell正在执行cd但是它只是在每个shell完成之后抛弃它的工作目录。 因此,你回到原点。

在你的情况下,你不需要多次调用exec()。 您可以确保您的cmdvariables包含多个指令,而不是1.在此情况下,CD 起作用。

 var cmd = `ls cd foo ls` var exec = require('child_process').exec; exec(cmd, function(err, stdout, stderr) { console.log(stdout); }) 

注意 :这段代码应该可以在Linux运行,但不能运行 看到这里