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

3 ответа

Решение

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

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

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

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

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

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

var cmd =  `ls
cd foo
ls`

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

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

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

Это работает. Но тогда он выбрасывает снаряд. Узел создает новую оболочку для каждого exec,

Вот варианты, которые могут помочь: http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback

Другие вопросы по тегам