NodeJS exec不能执行"cd " shell命令

46
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 "命令时会出现问题。如下所示,pwd命令可以正常执行,git status命令尝试执行但由于没有在git目录中执行而失败,但是cd命令失败了,导致其他命令无法成功执行。在nodeJS shell和nodeJS+ExpressJS webserver中都进行了尝试。


3个回答

88

每个命令都在独立的shell中执行,因此第一个cd只会影响该shell进程,而该进程随后终止。如果您想在特定目录中运行git,只需让Node为您设置路径:

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

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


看起来不起作用:我执行另一个.sh文件,在这个.sh文件中,我有“node ./myscript.js”并给出“找不到模块”,显示原始路径,而不是在'cwd'中给出的路径。 - stackdave
@stackdave:这应该可以工作。如果您无法使其工作,您可以打开另一个问题,并提供更多关于您正在具体执行的信息,最好附带一小组短文件以重现它。 - icktoofay

7

一次性调用exec(),执行多条命令

虽然你的shell确实正在执行cd命令,但每个shell在完成后都会丢弃其工作目录。因此你回到了原点。

在你的情况下,你不需要多次调用exec()。你可以确保你的cmd变量包含多条指令而不是一条。这种情况下CD起作用。

var cmd =  `ls
cd foo
ls`

var exec =  require('child_process').exec;

exec(cmd, function(err, stdout, stderr) {
        console.log(stdout);
})

注意:此代码应在Linux上工作,但不适用于Windows。请参见这里


6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接