O que você está tentando fazer não é possível. A razão para isso é que em um sistema POSIX (Linux, OSX, etc), um processo filho não pode modificar o ambiente de um processo pai. Isso inclui modificar o diretório de trabalho do processo pai e as variáveis de ambiente.
Quando você está na linha de comando e você vai para executar o seu nó do script, o seu processo atual ( bash
, zsh
, qualquer que seja) gera um novo processo que tem o seu próprio ambiente, normalmente uma cópia do seu ambiente atual (é possível alterar esta via chamadas de sistema ; mas isso está além do escopo desta resposta), permitindo que o processo faça o que for necessário em isolamento completo. Quando o subprocesso termina, o controle é devolvido ao processo do seu shell, onde o ambiente não foi afetado.
Existem muitos motivos para isso, mas, por um lado, imagine que você executou um script em segundo plano (via ./foo.js &
) e, à medida que era executado, ele começou a alterar seu diretório de trabalho ou sobrescrever o seu PATH
. Isso seria um pesadelo.
Se você precisar realizar algumas ações que requerem a alteração do diretório de trabalho do seu shell, você precisará escrever uma função em seu shell. Por exemplo, se você estiver executando o Bash, pode colocar isso em ~/.bash_profile
:
do_cool_thing() {
cd "/Users"
echo "Hey, I'm in $PWD"
}
e então essa coisa legal é possível:
$ pwd
/Users/spike
$ do_cool_thing
Hey, I'm in /Users
$ pwd
/Users
Se você precisa fazer coisas mais complexas além disso, você sempre pode chamar seu script nodejs a partir dessa função.
Esta é a única maneira de realizar o que está tentando fazer.