variabile esportata non persistente dopo l'esecuzione dello script


8

Sto affrontando un problema strano. Ho una VM con Solaris 11 e sto provando a scrivere alcuni script bash.

se, sulla shell, scrivo:

export TEST=aaa

e successivamente eseguire:

set

Vedo correttamente una nuova variabile di ambiente denominata TEST il cui valore è aaa. Se, tuttavia, faccio sostanzialmente la stessa cosa in una sceneggiatura. quando lo script termina, non vedo il set di variabili. Per fare un esempio concreto, se in un file test.sh ho:

#!/usr/bin/bash
echo 1: $TEST   #variable not defined yet, expect to print only 1:
echo 2: $USER
TEST=sss
echo 3:  $TEST
export TEST
echo 4:  $TEST

stampa:

1:
2: daniele
3: sss
4: sss

e dopo la sua esecuzione, TEST non è impostato nella shell. Mi sto perdendo qualcosa? Ho provato entrambi a fare export TEST = sss e la variabile set / export separata senza alcuna differenza.

Risposte:


15

esportazione: rende la variabile disponibile per i processi figlio, ma non per i genitori.

sorgente: esegue lo script nella shell senza creare un processo figlio

Per exalmpe, la variabile persistente può essere realizzata scrivendo in un file

#!/usr/bin/bash
echo 1: $TEST   #variable not defined yet, expect to print only 1:
CONFIGFILE=~/test-persistent.vars
if [ -r ${CONFIGFILE} ]; then
  # Read the configfile if it's existing and readable
  source ${CONFIGFILE}
fi
echo 2: $TEST
echo 3: $USER
TEST=sss
echo 4:  $TEST
echo TEST="$TEST"> ${CONFIGFILE}
echo 5:  $TEST

Anche questo non è esattamente quello che volevo ottenere, ma ho ottenuto il tuo punto. Grazie.
Daniele,

5

Per rendere visibili le variabili, è necessario sourcelo script che esporta le variabili. Vedere man source.


1
probabilmente non esiste una manpage di origine e si desidera help sourceinvece bash.
Spezzatino il

questo funziona se invoco direttamente lo script, (cioè se provo lo script con l'esportazione dalla shell), ma non sembra funzionare se provo lo script da un altro script.
Daniele,
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.