2014-05-14 18 views
2

哦......也許標題是不是真的很容易理解。所以讓我們稍微描述一下:如何將bash變量從提示中的函數導出到父shell?

.bashrc文件中,我設置了PS1以獲得自定義提示。在這個提示中,我需要一些額外的信息,我從其他特定功能中獲得。這個函數需要一些時間來執行,所以在控制檯中按回車後等待1秒並不酷。但我有想法緩存來自這個特定函數的返回值。

我需要檢查緩存標誌在每個提示打印,所以我不能使用變量,我必須打印提示符下使用功能,因爲sourceing .bashrc只有一個時間,但如果我通過功能PS1它每次都會被execed。

prompt_fun(){ 

    export CACHE_YES=1 
    export PROMPT_CACHE="Something" 
    echo "$PROMPT_CACHE"  

     #in real case here will be checking if cache is turned on. 
     #If yes, we use cached value from exported variable in first time. 
     #If no, we exec specific function and export values to env variables. 
} 

PS1="$(prompt_fun): "` 

當然,可變CACHE_YESPROMPT_CACHE在控制檯未設置,所以我無法控制緩存被改變CACHE_YES。我知道,當緩存應該改變,所以我可以輸入控制檯更改CACHE_YES=0但我的腳本不緩存後,新的價值觀它重新改變對CACHE_YES=1

如何使exportprompt_fun具有全球影響?

+0

子進程不能直接影響其父進程中的環境變量。一種可能性可能要經過文件系統......你那神祕的過程,需要在第二個也許可以寫入到文件系統中的某個地方,你的prompt_fun()可以讀取它。 –

+0

有區別?如果我使用命令獲取需要在提示中打印的信息,那麼我使用命令獲取信息將其寫入文件並將其讀回來?或者,也許你的意思是緩存標誌發送到文件並從文件中讀取它們?可能這會起作用,但我不確定每次打印提示時讀取文件的時間。 Elegance解決方案不應該創建臨時文件,因爲在所有的相同臨時緩存文件的多重命令行上工作也會出現問題。 – senfen

回答

2

簡短的回答是,你不能。由於prompt_fun被稱爲在命令替換,在該變量所作的任何更改子外殼消失子shell退出時。

相反,你要設置的PS1裏面的值prompt_fun,然後從PROMPT_COMMAND值調用prompt_fun,作爲參數的值在每個提示顯示之前,當前shell環境中執行。

prompt_fun() { 
    if [[ -z $CACHE ]]; then 
     # Set value of $CACHE 
    fi 
    PS1=something 
    PS1+=something_else 
    PS1+=$CACHE 
    PS1+=final_value 
} 

PROMPT_COMMAND='prompt_fun' # Yes, single quotes 
+0

是的,這項工作。十分感謝。 – senfen

相關問題