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