2011-10-18 6 views
8

Ho un codice come questo:Export non funzionante (da una funzione chiamata per ottenere la sua eco)

#!/usr/bin/env bash 

test_this(){ 
    export ABC="ABC" 
    echo "some output" 
} 

final_output="the otput is $(test_this)" 
echo "$ABC" 

Purtroppo la variabile ABC non si sta impostando.

Devo chiamare lo test_this in questo modo, dal momento che nel mio programma reale gli deduco alcuni argomenti, esegue varie operazioni complicate chiamando varie altre funzioni, che sulla strada esportano questo o quello (in base a tali argomenti), e alla fine viene assemblata una stringa di output da restituire. Chiamarlo due volte, una volta per ottenere le esportazioni e una volta per la stringa di output sarebbe male.

La domanda è: cosa posso fare per avere le esportazioni e la stringa di output in atto, ma solo per una chiamata a tale funzione?

La risposta che io sono felice con (grazie paxdiablo):

#!/usr/bin/env bash 

test_this(){ 
    export ABC="ABC" 
    export A_VERY_OBSCURE_NAME="some output" 
} 

test_this 
final_output="the otput is $A_VERY_OBSCURE_NAME" 
echo "$ABC" #works! 
unset A_VERY_OBSCURE_NAME 

risposta

7

Sì, è fase di impostazione. Sfortunatamente viene impostato nel sottoprocesso creato da $() per eseguire la funzione test_this e non ha alcun effetto sul processo principale.

E chiama due volte è probabilmente il modo più semplice di farlo, qualcosa di simile (con un valore di parametro "segreto" a dettare il comportamento se ha bisogno di essere diverso):

#!/usr/bin/env bash 

test_this(){ 
    export ABC="ABC" 
    if [[ "$1" != "super_sekrit_sauce" ]] ; then 
    echo "some output" 
    fi 
} 

final_output="the output is $(test_this)" 
echo "1:$ABC:$final_output" 
test_this super_sekrit_sauce 
echo "2:$ABC:$final_output" 

quali uscite:

1::the output is some output 
2:ABC:the output is some output 

Se davvero desideri solo chiamare una volta, si potrebbe fare qualcosa di simile:

#!/usr/bin/env bash 

test_this(){ 
    export ABC="ABC" 
    export OUTPUT="some output" 
} 

test_this 
final_output="the output is ${OUTPUT}" 
echo "1:$ABC:$final_output" 

In altre parole, utilizzare lo stesso metodo per estrarre l'output come per le altre informazioni.

+0

Grazie per questa intuizione, ma non mi aiuta. C'è un modo per chiamare o modificare questa funzione, in modo che io possa esportare l'esportazione all'esterno? – robert

+1

@robert: vedere l'aggiornamento. Il tuo vero problema è che '$()' crea necessariamente un sottoprocesso quindi qualsiasi modifica dell'ambiente sarà limitata a quel sottoprocesso. Se invece si chiama direttamente la funzione, è possibile influire sull'ambiente di processo corrente. – paxdiablo

+0

Grazie, sono andato con la seconda opzione, aggiungendo alla fine: unset OUTPUT. – robert