Могу ли я получить доступ к программам CLI из дочернего процесса Node? - PullRequest
0 голосов
/ 03 апреля 2020

Я написал сценарий узла, который cd последовательно помещается в несколько каталогов и выполняет команды bash для развертывания содержимого репозиториев в моей среде разработки.

Native bash Команды работают нормально, например cd, ls, но они выглядят как подоболочка или дочерний процесс (или каков бы ни был правильный термин, я не понимаю внутреннюю работу Bash), которая открывается узлом notn ' у меня нет ничего доступного для моего обычного приглашения.

Например,

  • пользовательский набор инструментов bash, доступный по всему миру
  • nvm (это возможно даже для запустить другую версию узла в подоболочке узла?)
  • разрывы gulp, поскольку на нем не установлена ​​необходимая версия узла.

Возможно ли получить доступ к этим программам / командам из узла подоболочки? Я использую модуль узла child_process.

const { exec } = require('child_process');

function command (command) {
    exec (command, (err, stdout, stderr) => {
        if (err) {
            error(err);
        } else {
            message(`stdout: ${stdout}`);
            message(`stderr: ${stderr}`);
        }
    });
}

Используется как в:

command('nvm use 6');
command('gulp build');
command('pde deploy');

1 Ответ

0 голосов
/ 13 апреля 2020

Дочерний процесс не запускается как bash. child_process порождает исполняемый файл, используя обычную оболочку sh. Если вам нужно, чтобы команды выполнялись в bash, запускаемая вами командная строка должна быть заключена в bash -c. Например:

command('bash -c "my command here"');

Кроме того, каждая выполняемая вами команда является подпроцессом, который не влияет ни на родительский процесс, ни на любые последующие подпроцессы. Таким образом, встроенная оболочка, такая как cd, изменит только каталог для этого подпроцесса, который немедленно исчезнет. Вы увидите это, если запустите:

command('cd /');
command('ls');

Команда ls покажет текущий рабочий каталог, а не каталог root.

Если вы запустите команду с bash -c а $PATH и другие переменные среды по-прежнему не настроены так, как вам нужно, вам нужно отладить сценарии запуска оболочки. Возможно, есть разница между интерактивными оболочками (.bash_profile) и всеми оболочками (.bashrc).

Обратите внимание, что для полностью неинтерактивных оболочек может потребоваться явно указать сценарий запуска, который вы хотите запустить.

...