script BASH para definir variáveis de ambiente que não funcionam

96

Eu escrevi o seguinte script para definir algumas variáveis de ambiente quando necessário.

#!/bin/sh
export BASE=/home/develop/trees
echo $BASE
export PATH=$PATH:$BASE
echo $PATH

Abaixo do comando e dos resultados que posso ver no meu terminal: o script é executado, mas as variáveis não são definidas no final.

~$: ./script.sh
/home/develop/trees
/bin:......:/home/develop/trees
~$: echo $BASE

~$: 

O que há de errado? Desde já, obrigado. Mirko

    
por MirkoZa 15.07.2011 / 10:18

4 respostas

134

export exporta a atribuição de variável para sub-shells , ou seja, shells que são iniciados como processos-filho do shell contendo a diretiva export . Seu ambiente de linha de comando é o pai do shell do script, portanto ele não vê a atribuição da variável.

Você pode usar o comando source bash para executar os comandos de script no ambiente shell atual e obter o que deseja, por exemplo,

source script.sh
echo $BASE

Produzirá

/home/develop/trees

O comando . é um sinônimo para source , que é visto frequentemente em scripts.

. script.sh     # identical to "source script.sh"
    
por user21322 15.07.2011 / 10:53
5

Quando você executa um script, ele é executado em uma subcamada. As variáveis são válidas apenas no contexto dessa sub-camada. Defina-os em .bashrc ou .profile e leia as variáveis e sub-unidades . A instrução export trabalha a hierarquia (shell atual e todas as suas subpastas) não como no seu exemplo.

Alternativamente (se você realmente quiser que o script efetue o efeito do seu shell atual), execute-o como:

. ./script.sh

Isso faz com que ele seja executado em seu shell atual, mas também não passará variáveis na hierarquia.

    
por con-f-use 15.07.2011 / 10:48
4

Eu geralmente quero definir uma variável de ambiente sem problemas.

Aqui está o que eu adiciono ao meu .bashrc para implementar essa conveniência.

defect() {
    if [  ] && [ -z  ]
    then
        eval 'export DEFECT='
        return 0
    else
        echo 'Usage: defect {number}'
        return 1
    fi
}
    
por jlettvin 13.09.2013 / 18:49
0

Você pode tentar algo assim

CURRENT_DIR='pwd'
echo "SOME_PATH is pointing to ${CURRENT_DIR}"
#Export SOME_PATH for current working directory
export SOME_PATH=${CURRENT_DIR}
    
por silentsudo 11.01.2017 / 11:14