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