如何将bash变量从提示中执行的函数导出到父shell?

时间:2014-05-14 20:59:02

标签: bash function export prompt

哦......可能标题并不容易解释。所以让我们稍微描述一下:

.bashrc文件中,我设置PS1以获取自定义提示。在这个提示中,我需要一些额外的信息,我从其他特定功能获得。此功能需要一些时间来执行,因此在按下进入控制台后等待1秒并不酷。但我有想法从这个特定的函数缓存返回值。

我需要在每个提示打印中检查缓存标志,所以我不能使用变量,我必须在打印提示中使用函数,因为源.bashrc只有一次,但如果我将函数传递给PS1每次都会被执行。

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

如何使export prompt_fun具有全局效应?

1 个答案:

答案 0 :(得分:2)

简短的回答是,你做不到。由于在命令替换中调用了prompt_fun,因此当子shell退出时,对该子shell中的变量所做的任何更改都会消失。

相反,您需要在 PS1内设置prompt_fun 的值,然后从prompt_fun的值调用PROMPT_COMMAND,因为该参数的值在每个提示显示之前在当前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