NodeJS exec не работает для оболочки "cd" 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" cmd. как вы видите ниже, pwd работает, статус git пытается работать, но терпит неудачу, потому что он не выполняется в каталоге git, но cd cmd не останавливает дальнейшее успешное выполнение других cmds. Пробовал в nodeJS shell, а также веб-сервер nodeJS + ExpressJS.

Ответ 1

Каждая команда выполняется в отдельной оболочке, поэтому первый cd влияет только на этот процесс оболочки, который затем завершается. Если вы хотите запустить git в определенном каталоге, просто установите Node путь для вас:

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

cwd (текущий рабочий каталог) является одним из многих параметров, доступных для exec.

Ответ 3

Вместо вызова exec() несколько раз. Вызов exec() один раз для нескольких команд

Ваша оболочка IS выполняет cd, но только то, что каждая оболочка отбрасывает рабочую директорию после ее завершения. Следовательно, вы снова на первом месте.

В вашем случае вам не нужно вызывать exec() более одного раза. Вы можете убедиться, что ваша переменная cmd содержит несколько инструкций вместо 1. В этом случае работает .

var cmd =  `ls
cd foo
ls`

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

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

Примечание. Этот код должен работать на Linux, но не на Windows. См. здесь