Bash跟踪函数中的变量

时间:2017-11-07 02:58:25

标签: bash function scope zsh

完整的非工作代码:

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作为主终端。

2 个答案:

答案 0 :(得分:0)

您有不同的方式来达到您所描述的行为。

  • 1)在你的不同功能中共享一个全局变量,但不是 最性感的
  • 2)使用您的函数的返回码来设置/重置您的myvar=x()
  • 3)您也可以通过引用传递变量

http://www.fvue.nl/wiki/Bash:_Passing_variables_by_reference

Bash - Passing arguments 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复制到其中。