origem vs exportação vs exportação LD_LIBRARY_PATH

1

Ao compilar aplicativos do código-fonte usando make ou cmake , as instruções geralmente dizem

source <some path> <parameter>

export <some text>

Além disso, muito tempo LD_LIBRARY_PATH aparece, sendo usado com export .

Qual é a diferença de source e export ? Por que precisamos deles?

    
por ankit7540 19.12.2016 / 10:24

1 resposta

4

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 .

    
por ridgy 19.12.2016 / 11:17