Os comandos do shell source
e export
são coisas realmente diferentes. Resumindo:
source
Quando você chama um shell script da maneira normal (digamos com ./myscript.sh
ou sh myscript.sh
), ele será executado em seu próprio contexto de processo (um novo ambiente de processo), portanto todas as variáveis definidas no script não serão executadas. disponível no shell de chamada. Ao executar um script usando o comando source
, ele será executado dentro do contexto do script de chamada. Dessa forma, você pode definir variáveis de ambiente chamando source myscript
.
export
Variáveis de ambiente geralmente são válidas apenas no contexto (local) do processo atual. Portanto, se você executar algo (script ou programa) que solicite um novo ambiente de processo, o ambiente local não será visto no novo processo. Para transmitir valores de ambiente a um processo filho, você precisa "exportá-los" antes da atribuição com export
, por exemplo, export VAR=value
.
export LD_LIBRARY_PATH
A variável de ambiente especial LD_LIBRARY_PATH
define o caminho onde as bibliotecas carregáveis são pesquisadas (semelhante à variável PATH
, que define onde procurar executáveis). Por padrão, as bibliotecas são pesquisadas em /lib
, /usr/lib
e similares. As bibliotecas instaladas em diretórios não padrão (por exemplo, /opt/program/lib
) só podem ser carregadas quando esses caminhos são definidos adicionalmente por export LD_LIBRARY_PATH=/opt/program/lib
neste exemplo. Você precisa exportar aqui, pois isso deve ser conhecido no novo ambiente de processo em que seu programa está sendo executado.
Persistência
O ambiente de processo existe desde que o processo esteja em execução; isso também vale para as variáveis de ambiente (quando não desmarcadas explicitamente). Se o processo for eliminado (por exemplo, fechando a janela do terminal), geralmente todos os subprocessos também serão eliminados e o (s) ambiente (s) será (ão) eliminado (s). Mais precisamente, isso depende de como o processo filho reage em SIGHUP
. Caso contrário, ele será executado como filho do processo do usuário (por exemplo, /sbin/upstart --user
) ou do processo init (PID = 1).
Uma forma de fazer com que os subprocessos superem a eliminação do processo pai é liberá-los do processo pai usando o comando nohup
(consulte man nohup
), que não passará SIGHUP
para o filho e liberará o processo para o fundo:
nohup <progname> &
desanexará o processo do pai, atribuirá STDIN a /dev/null
e STDOUT a ./nohup.out
.