Eu criei um script bash para executar alguns outros programas com variáveis de ambiente personalizadas. Aqui está meu primeiro script chamado run-hello.sh
em/home/user
#!/bin/bash
export PATH=$PATH":/home/user/cool/path"
hello.sh
exit 0
E em /home/user/cool/path
eu tenho o hello.sh
script:
#\!/bin/bash
echo Hello from $(pwd)
A execução do primeiro script (run-hello.sh) produz:
Hello from /home/user
Minhas perguntas:
o
export
chamado no primeiro script só é válido pela duração em que o script estava ativo? Se depois de executar o script euecho $PATH
não ver o caminho adicionado pelo script... Este é o comportamento pretendido? Como posso fazê-lo resistir pelo menos durante a duração do terminal?Por que o resultado é impresso
/home/user
em vez de/home/user/cool/path
?
A princípio, você precisa considerar que quando, sob um shell, você inicia algum script de shell, seu shell bifurca um novo shell (vamos chamá-lo de subshell) que executará os comandos do script.
Então man bash diz:
Conseqüentemente, quando você exporta seu
PATH
, seu novo valor se torna parte de seu ambiente de sub-shell e é disponibilizado para qualquer processo filho que ele for acionado. (hello.sh por exemplo)Portanto, se você executar
echo $PATH
imediatamente após executar hello.sh, o valor atualizado deverá ser exibido.No entanto, você sai do seu shell ! (o sub-shell executando run-hello.sh termina) Algum ancestral dele (provavelmente o shell sob o qual você executou run-hello.sh) assume o controle de volta, mas desconhecendo completamente as alterações ambientais de run-hello.sh.
Então, sim, esse é de fato o comportamento pretendido.
Agora, o diretório de trabalho atual de uma tarefa quando iniciada é herdado de seu pai. Ele não será alterado automaticamente para o diretório em que o programa reside.
Portanto, devo suspeitar que sua chamada para
run-hello.sh
foi feita a partir do/home/user
diretório.Para resumir: O tempo de vida de qualquer variável exportada é igual ao tempo de vida da tarefa que é responsável pela exportação e a validade é garantida para a própria tarefa e todos os seus filhos (no momento da inicialização).