То, что вы пытаетесь сделать, невозможно. Причина этого в том, что в системе 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 из этой функции.
Это единственный способ добиться того, что вы пытаетесь сделать.