完整的非工作代码:
change_git=''
function cd() {
change_git=''
builtin cd "$@"
}
function git_info() {
if [ -z $change_git]; then
local st=$(bash -c "git symbolic-ref HEAD" 2> /dev/null)
local bn=${st#refs/heads/}
if [[ ! -z "${bn// }" ]]; then
change_git="branch is: ${st#refs/heads/}"
fi
fi
echo $change_git
}
PS1=$'Dir git status: $(git_info)'
这就是我想要实现的目标:
git分支应缓存在change_git
变量中,直到目录发生变化。但是,这并没有发生,每次都会计算变量。
由于我想打印此提示,这会导致提示缓慢(因此我的缓存原因)。是的,一旦删除此代码,提示就会更快,因此我知道它是每次都执行的。
此外,这是 zsh 。是的,我也在使用oh-my-zsh。
最后,请不要让我仅用bash -c "git symbolic-ref HEAD"
替换git symbolic-ref HEAD
。我正在使用WSL并将Ubuntu中的git共享到我的Windows;我正在使用MSYS2作为主终端。
答案 0 :(得分:0)
您有不同的方式来达到您所描述的行为。
myvar=x()
http://www.fvue.nl/wiki/Bash:_Passing_variables_by_reference
答案 1 :(得分:0)
你的第二个版本与第一版非常不同,因为在这两种情况下你并没有回应不同的东西。
当$myvar
为空时,您执行以下操作:
test=$myvar # sets $test to empty string
myvar='something'$myvar # sets $myvar to 'something'
echo `$myvar$test` # echoes 'something'.
如果$myvar
不为空,请执行以下操作:
echo $myvar$test # echoes 'something'
您永远不会获得somethingsomethingsomething
,因为您追加$myvar
的唯一时间是$myvar
为空,然后您附加一个空字符串。 $test
始终为空字符串,因为您只是将空$myvar
复制到其中。