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
.
Ответ 2
Он работает. Но тогда он бросает раковину. Node создает новую оболочку для каждого exec
.
Вот параметры, которые могут помочь: http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback
Ответ 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. См. здесь