То, что вы пытаетесь сделать, невозможно. Причина этого в том, что в системе POSIX (Linux, OSX и т. Д.) Дочерний процесс не может изменять среду родительского процесса. Это включает изменение рабочего каталога родительского процесса и переменных среды.
Когда вы находитесь в командной строке и выполняете свой Node-скрипт, ваш текущий процесс ( bash
, zsh
что угодно) порождает новый процесс, который имеет собственную среду, обычно копию вашей текущей среды (это можно изменить с помощью системных вызовов ; но это выходит за рамки данного ответа), позволяя этому процессу делать все, что ему нужно, в полной изоляции. Когда подпроцесс завершается, управление возвращается процессу вашей оболочки, при этом среда не пострадала.
Для этого есть много причин, но, во-первых, представьте, что вы выполнили скрипт в фоновом режиме (через ./foo.js &
), и по мере его выполнения он начал изменять ваш рабочий каталог или переопределять ваш PATH
. Это был бы кошмар.
Если вам нужно выполнить некоторые действия, требующие изменения рабочего каталога вашей оболочки, вам нужно будет написать функцию в вашей оболочке. Например, если вы используете Bash, вы можете поместить это в свой ~/.bash_profile
:
do_cool_thing() {
cd "/Users"
echo "Hey, I'm in $PWD"
}
и тогда эта крутая вещь выполнима:
$ pwd
/Users/spike
$ do_cool_thing
Hey, I'm in /Users
$ pwd
/Users
Если вам нужно сделать еще более сложные вещи, вы всегда можете вызвать свой скрипт nodejs из этой функции.
Это единственный способ добиться того, что вы пытаетесь сделать.