web-dev-qa-db-fra.com

nodeJS exec ne fonctionne pas pour "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 ne fonctionne pas pour "cd" Shell cmd. comme vous le voyez ci-dessous, pwd fonctionne, le statut git tente de fonctionner mais échoue car il n'est pas exécuté dans un répertoire git, mais cd cmd ne parvient pas à arrêter l'exécution réussie d'autres cmds. Essayé dans le shell nodeJS, ainsi que serveur Web nodeJS + ExpressJS.

22
user1447121

Chaque commande étant exécutée dans un shell distinct, la première cd affecte uniquement le processus Shell qui se termine ensuite. Si vous voulez exécuter git dans un répertoire particulier, il suffit que Node définisse le chemin à votre place:

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

cwd (répertoire de travail en cours) est l’une des nombreuses options disponibles pour exec .

46
icktoofay

Ça fonctionne. Mais alors, il jette la coquille. Le nœud crée un nouveau shell pour chaque exec.

Voici des options qui peuvent aider: http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback

4
Joe Frambach

Plutôt que d'appeler exec () plusieurs fois. Appelez exec () une fois pour plusieurs commandes

Votre shell IS exécute cd mais chaque shell jette simplement son répertoire de travail une fois terminé. Par conséquent, vous êtes de retour à la case départ. 

Dans votre cas, vous n'avez pas besoin d'appeler exec () plus d'une fois. Vous pouvez vous assurer que votre variable cmd contient plusieurs instructions au lieu de 1. CD will fonctionne dans ce cas.

var cmd =  `ls
cd foo
ls`

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

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

Note : Ce code devrait fonctionner sur Linux mais pas Windows . Voir ici

0
Cameron