Я пытаюсь изменить рабочий каталог моего сценария Node.js, когда он запускается из сценария bin. У меня примерно следующее:
#!/usr/bin/env node
process.chdir('/Users')
Когда я затем запускаю этот файл с помощью ./bin/nodefile
, он выходит, но рабочий каталог текущего контекста оболочки не изменился. Я также пробовал shelljs , но это тоже не работает.
Как лучше всего это сделать? Я понимаю, что это работает, но это отдельный процесс.
Ответы:
Правильный способ смены каталогов - это файл
process.chdir(directory)
. Вот пример из документации :Это также можно проверить в REPL Node.js:
источник
У Node нет встроенного метода для изменения CWD базовой оболочки, запускающей процесс Node.
Вы можете изменить текущий рабочий каталог процесса Node с помощью команды
process.chdir()
.Когда процесс Node существует, вы снова окажетесь в CWD, в котором начали процесс.
источник
То, что вы пытаетесь сделать, невозможно. Причина этого в том, что в системе POSIX (Linux, OSX и т. Д.) Дочерний процесс не может изменять среду родительского процесса. Это включает изменение рабочего каталога родительского процесса и переменных среды.
Когда вы находитесь в командной строке и выполняете свой Node-скрипт, ваш текущий процесс (
bash
,zsh
что угодно) порождает новый процесс, который имеет собственную среду, обычно копию вашей текущей среды (это можно изменить с помощью системных вызовов ; но это выходит за рамки данного ответа), позволяя этому процессу делать все, что ему нужно, в полной изоляции. Когда подпроцесс завершается, управление возвращается процессу вашей оболочки, при этом среда не пострадала.Для этого есть много причин, но, во-первых, представьте, что вы выполнили скрипт в фоновом режиме (через
./foo.js &
), и по мере его выполнения он начал изменять ваш рабочий каталог или переопределять вашPATH
. Это был бы кошмар.Если вам нужно выполнить некоторые действия, требующие изменения рабочего каталога вашей оболочки, вам нужно будет написать функцию в вашей оболочке. Например, если вы используете Bash, вы можете поместить это в свой
~/.bash_profile
:и тогда эта крутая вещь выполнима:
Если вам нужно сделать еще более сложные вещи, вы всегда можете вызвать свой скрипт nodejs из этой функции.
Это единственный способ добиться того, что вы пытаетесь сделать.
источник
Краткий ответ: нет (простого?) Способа, но вы можете сделать то, что служит вашей цели.
Я сделал аналогичный инструмент (небольшую команду, которая, учитывая описание проекта, устанавливает среду, пути, каталоги и т. Д.). Что я делаю, так это настраиваю все, а затем создаю оболочку с:
После выполнения вы окажетесь в оболочке с новым каталогом (и, в моем случае, средой). Конечно, вы можете изменить bash для любой оболочки, которую предпочитаете. Основные отличия от того, о чем вы изначально просили:
Однако для меня такие различия желательны.
источник