2011-10-18 21 views
8

我有這樣的代碼:出口不工作(從叫了它的回聲功能)

#!/usr/bin/env bash 

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

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

不幸的是,變量ABC沒有被設置。

我有打電話給test_this這樣的,因爲在我的真正的程序,我給一些參數,它執行各種複雜的操作調用各種其他功能,在途中出口這樣或那樣的(立足於這些參數),和最後一些輸出字符串被組裝以返回。調用它兩次,一次獲取輸出,一次輸出字符串會很糟糕。

現在的問題是:我能做些什麼來使輸出和輸出字符串都到位,但只需調用一次這樣的函數?

,我很高興與答案(謝謝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 

回答

7

是的,這是設置。不幸的是,它在子進程中被設置,其由$()創建以運行test_this函數並且對父進程沒有影響。

,把它兩次可能是最簡單辦法做到這一點,像(用一個「祕密」參數值來決定的行爲,如果它需要是不同的):

#!/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" 

,輸出:

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

如果你真的想調用它一次,你可以這樣做:

#!/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" 

換句話說,使用與其他信息相同的方法提取輸出。

+0

感謝您的洞察,但它不幫助我。有沒有一種方法可以調用或更改此函數,以便實際獲得外部輸出? – robert

+1

@robert:查看更新。你真正的問題是'$()'必然會創建一個子進程,所以任何環境變化都將限制在那個子進程中。如果您直接調用該函數,則可能會影響當前的進程環境。 – paxdiablo

+0

謝謝,我帶着第二個選項,最後加入:unset OUTPUT。 – robert