哦......可能标题并不容易解释。所以让我们稍微描述一下:
在.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_YES
和PROMPT_CACHE
未在控制台中设置,因此我无法控制缓存是否正在更改CACHE_YES
。我知道缓存何时应该更改,因此我可以输入控制台来更改CACHE_YES=0
但是我的脚本在缓存新值后不会将其重新更改为CACHE_YES=1
。
如何使export
prompt_fun
具有全局效应?
答案 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