To, co próbujesz zrobić, nie jest możliwe. Powodem tego jest fakt, że w systemie POSIX (Linux, OSX itp.) Proces potomny nie może modyfikować środowiska procesu nadrzędnego. Obejmuje to modyfikację katalogu roboczego procesu nadrzędnego i zmiennych środowiskowych.
Kiedy jesteś w linii poleceń i idziesz wykonać skrypt Node, twój bieżący proces ( bash
, zsh
cokolwiek) odrodzi nowy proces, który ma swoje własne środowisko, zazwyczaj kopię twojego obecnego środowiska (można to zmienić poprzez wywołania systemowe ; ale to wykracza poza zakres tej odpowiedzi), pozwalając temu procesowi robić wszystko, co musi, w całkowitej izolacji. Po zakończeniu podprocesu kontrola jest przekazywana z powrotem do procesu powłoki, gdzie nie ma to wpływu na środowisko.
Istnieje wiele powodów takiego stanu rzeczy, ale po pierwsze, wyobraź sobie, że wykonałeś skrypt w tle (przez ./foo.js &
) i podczas jego działania zaczął on zmieniać katalog roboczy lub nadpisywać PATH
. To byłby koszmar.
Jeśli musisz wykonać jakieś czynności, które wymagają zmiany katalogu roboczego twojej powłoki, będziesz musiał napisać funkcję w swojej powłoce. Na przykład, jeśli używasz Bash, możesz umieścić to w swoim ~/.bash_profile
:
do_cool_thing() {
cd "/Users"
echo "Hey, I'm in $PWD"
}
a wtedy ta fajna rzecz jest wykonalna:
$ pwd
/Users/spike
$ do_cool_thing
Hey, I'm in /Users
$ pwd
/Users
Jeśli potrzebujesz dodatkowo zrobić bardziej złożone rzeczy, zawsze możesz wywołać swój skrypt nodejs z tej funkcji.
To jedyny sposób, w jaki możesz osiągnąć to, co próbujesz zrobić.