Quello che stai cercando di fare non è possibile. La ragione di ciò è che in un sistema POSIX (Linux, OSX, ecc.), Un processo figlio non può modificare l'ambiente di un processo genitore. Ciò include la modifica della directory di lavoro e delle variabili di ambiente del processo genitore.
Quando si è sulla riga di comando e si va ad eseguire il nodo lo script, il processo in corso ( bash
, zsh
, a prescindere) genera un nuovo processo, che ha il proprio ambiente, in genere una copia del vostro ambiente corrente (è possibile cambiare questa via le chiamate di sistema ; ma questo va oltre lo scopo di questa risposta), consentendo a quel processo di fare tutto ciò che deve fare in completo isolamento. Quando il sottoprocesso esce, il controllo viene restituito al processo della shell, dove l'ambiente non è stato influenzato.
Ci sono molte ragioni per questo, ma per uno, immagina di aver eseguito uno script in background (tramite ./foo.js &
) e mentre veniva eseguito, ha iniziato a cambiare la tua directory di lavoro o sovrascrivere la tua PATH
. Sarebbe un incubo.
Se è necessario eseguire alcune azioni che richiedono la modifica della directory di lavoro della shell, sarà necessario scrivere una funzione nella shell. Ad esempio, se stai utilizzando Bash, potresti inserire questo nel tuo ~/.bash_profile
:
do_cool_thing() {
cd "/Users"
echo "Hey, I'm in $PWD"
}
e poi questa cosa interessante è fattibile:
$ pwd
/Users/spike
$ do_cool_thing
Hey, I'm in /Users
$ pwd
/Users
Se hai bisogno di fare cose più complesse in aggiunta, puoi sempre chiamare il tuo script nodejs da quella funzione.
Questo è l'unico modo in cui puoi realizzare ciò che stai cercando di fare.