Script BASH per impostare le variabili di ambiente non funzionanti


137

Ho scritto il seguente script per impostare alcune variabili di ambiente quando necessario.

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

Sotto il comando e i risultati che posso vedere sul mio terminale: lo script viene eseguito, ma le variabili non sono impostate alla fine.

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

~$: 

Cosa c'è che non va? Grazie in anticipo. mirko

Risposte:


194

exportesporta l'assegnazione delle variabili ai processi figlio della shell in cui è exportstato eseguito il comando. L'ambiente della riga di comando è il genitore della shell dello script, quindi non vede l'assegnazione delle variabili.

È possibile utilizzare il comando .(o source) bash per eseguire i comandi di script nell'ambiente shell corrente e ottenere ciò che si desidera, ad es

source ./script.sh
echo "$BASE"

Produrrà

/home/develop/trees

Il sourcecomando, spesso visto negli script, è sinonimo di bash ., che fa parte dello standard POSIX (quindi .è disponibile nel trattino, ad esempio, ma sourcenon lo è).

. ./script.sh     # identical to "source ./script.sh"

( . script.she source script.shcercherà prima script.shin PATH, quindi è più sicuro specificare il percorso verso script.sh.)


29
Non è necessario exportpassare variabili alle subshell, una subshell è una copia della shell corrente, incluse variabili e funzioni, ecc. Le variabili esportate vengono copiate nei nuovi processi generati dalla shell, indipendentemente dal fatto che tale processo sia o meno un'altra shell. In secondo luogo, .è il comando POSIX per l'approvvigionamento. Bash aggiunge sourcecome sinonimo più leggibile, ma non puoi fare affidamento sul fatto che sia disponibile in sh. Infine, . ./scriptinvece di . scriptse vuoi evitare sorprese. mywiki.wooledge.org/BashFAQ/060
geirha,

Se si genera uno script E si utilizza la pipe, l'ambiente di provenienza non è disponibile per il genitore. es. 'source setit.sh' va bene. 'source setit.sh | tee setit.log' non va bene. Sorprendente. Non intuitivo
Gaoithe

10

Quando si esegue uno script, viene eseguito in una subshell. Le variabili sono valide solo nel contesto di quella subshell. Impostali nel tuo .bashrco .profilee leggi su variabili e subshells . L' exportistruzione funziona in modo gerarchico (shell corrente e tutto ciò che è subshells) non in alto come nell'esempio.

In alternativa (se vuoi davvero che lo script abbia effetto sull'ambiente della tua shell corrente) eseguilo come:

. ./script.sh

Questo fa sì che venga eseguito nella shell corrente ma non passerà neanche le variabili nella gerarchia.


5

Spesso voglio impostare una variabile d'ambiente senza problemi.

Ecco cosa aggiungo al mio .bashrc per implementare questa comodità.

defect() {
    if [ $1 ] && [ -z $2 ]
    then
        eval 'export DEFECT=$1'
        return 0
    else
        echo 'Usage: defect {number}'
        return 1
    fi
}

-1

Puoi provare qualcosa del genere

CURRENT_DIR=`pwd`
echo "SOME_PATH is pointing to ${CURRENT_DIR}"
#Export SOME_PATH for current working directory
export SOME_PATH=${CURRENT_DIR}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.