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.
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
.
Ç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
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