Estou tentando alterar o diretório de trabalho do meu script Node.js quando ele é executado a partir de um script bin. Eu tenho algo como o seguinte:
#!/usr/bin/env node
process.chdir('/Users')
Quando eu executo este arquivo com ./bin/nodefile
, ele sai, mas o diretório de trabalho do contexto do shell atual não mudou. Eu também tentei shelljs , mas isso também não funciona.
Qual é a melhor maneira de fazer isso? Eu entendo que está funcionando, mas é apenas um processo separado.
javascript
node.js
terminal
command-line-interface
cd
Jonovono
fonte
fonte
Respostas:
A maneira correta de mudar de diretório é com
process.chdir(directory)
. Aqui está um exemplo da documentação :Isso também pode ser testado no REPL do Node.js:
fonte
Não existe um método integrado para o Node alterar o CWD do shell subjacente que executa o processo do Node.
Você pode alterar o diretório de trabalho atual do processo do Nó por meio do comando
process.chdir()
.Quando o processo Node existir, você se encontrará de volta ao CWD em que iniciou o processo.
fonte
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 seuPATH
. 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
:e então essa coisa legal é possível:
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.
fonte
Resposta curta: maneira não (fácil?), Mas você pode fazer algo que atenda ao seu propósito.
Eu fiz uma ferramenta semelhante (um pequeno comando que, dada a descrição de um projeto, define ambiente, caminhos, diretórios, etc.). O que eu faço é configurar tudo e, em seguida, gerar um shell com:
Após a execução, você estará em um shell com o novo diretório (e, no meu caso, ambiente). Claro, você pode alterar o bash para qualquer shell de sua preferência. As principais diferenças em relação ao que você pediu originalmente são:
No entanto, para mim, essas diferenças são desejáveis.
fonte