【问题标题】:Bash environment variable not updatingBash 环境变量不更新
【发布时间】:2012-10-17 14:47:38
【问题描述】:

我在我的 repo 中使用 git post-checkout 挂钩将当前分支转换为一个变量,然后我想在 PHP 等其他地方使用它。

以下是我的结帐后脚本:

#!/bin/bash
echo $GITBRANCH
GITBRANCH=`git symbolic-ref HEAD | cut -d/ -f3-`
echo $GITBRANCH
export $GITBRANCH

但是它没有更新。例如:

>git checkout master
Switched to branch 'master'
develop
master
>echo $GITBRANCH
develop

单独运行GITBRANCH=git symbolic-ref HEAD | cut -d/ -f3- 命令将生成当前分支名称。

为什么钩子不全局更新 $GITBRANCH 变量?

【问题讨论】:

  • 我很确定你不能以这种方式将正在运行的进程中的变量注入到父进程的环境中。
  • export 允许其子进程使用变量,而不是其父进程。

标签: linux git bash shell


【解决方案1】:

当您在脚本中设置变量时,它将仅在脚本运行的 shell 中可用。一旦进程终止,您设置的变量就永远消失了!

如果您希望变量随处可用,.profile.bashrc 可能会更好。

【讨论】:

  • 不幸的是,虽然最初可以使用它,但在签出新分支时它仍然不会更新?
【解决方案2】:

一个两步的过程应该完成你想要的:

1) 在您的结帐后脚本中,创建一个包含您要导出的变量的临时文件。类似的东西

#!/bin/bash
GITBRANCH=`git symbolic-ref HEAD | cut -d/ -f3-`
echo "GITBRANCH=$GITBRANCH" > /tmp/new-branch

2) 创建一个bash 函数作为git 的包装器,并使用它来获取源 结帐后的临时文件:

# Put this in .bashrc
git () {
    command git "$@"
    if [[ $1 = "checkout" ]]; then
        . /tmp/new-branch
    fi
}

$ git checkout master
Switched to branch 'master'
$ echo $GITBRANCH
master

【讨论】:

  • 只需要输入 git 二进制文件的完整路径,否则会陷入死循环。
  • 你是对的;当我忙别的事情时,我正在测试一个解决方案。我想你也可以使用内置的command来抑制函数查找,这样你就可以继续使用路径查找而不是硬编码的路径。
【解决方案3】:

运行带有点的脚本。

. script

【讨论】:

    【解决方案4】:

    试试:

    export GITBRANCH
    

    也就是说,没有美元符号。

    【讨论】:

    • 确实不应该使用美元符号,但这并不能解决他的问题。导出什么并不重要。它被导出到脚本退出时消失的环境。
    猜你喜欢
    • 1970-01-01
    • 2013-10-29
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 2015-02-16
    相关资源
    最近更新 更多