Próbuję zmienić katalog roboczy mojego skryptu Node.js, gdy jest on uruchamiany ze skryptu bin. Mam coś takiego:
#!/usr/bin/env node
process.chdir('/Users')
Kiedy następnie uruchamiam ten plik za pomocą ./bin/nodefile
, kończy się, ale katalog roboczy bieżącego kontekstu powłoki nie uległ zmianie. Próbowałem też shelljów , ale to też nie działa.
Jaki jest najlepszy sposób, aby to zrobić? Rozumiem, że to działa, ale to tylko oddzielny proces.
javascript
node.js
terminal
command-line-interface
cd
Jonovono
źródło
źródło
Odpowiedzi:
Właściwy sposób zmiany katalogów to w rzeczywistości
process.chdir(directory)
. Oto przykład z dokumentacji :Można to również przetestować w REPL Node.js:
źródło
Nie ma wbudowanej metody dla Node, aby zmienić CWD podstawowej powłoki, na której działa proces Node.
Państwo może zmienić bieżący katalog roboczy w procesie węzła za pomocą polecenia
process.chdir()
.Gdy proces Node istnieje, znajdziesz się z powrotem w CWD, w którym rozpocząłeś proces.
źródło
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
:a wtedy ta fajna rzecz jest wykonalna:
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ć.
źródło
Krótka odpowiedź: nie (łatwa?) Droga, ale możesz zrobić coś, co służy twojemu celowi.
Zrobiłem podobne narzędzie (małe polecenie, które na podstawie opisu projektu ustawia środowisko, ścieżki, katalogi itp.). To, co robię, to konfiguruję wszystko, a następnie spawnuję powłokę z:
Po wykonaniu będziesz w powłoce z nowym katalogiem (i, w moim przypadku, środowiskiem). Oczywiście możesz zmienić bash na dowolną preferowaną powłokę. Główne różnice w stosunku do tego, o co prosiłeś, to:
Jednak dla mnie te różnice są pożądane.
źródło