Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Bash环境变量未更新_Linux_Git_Bash_Shell - Fatal编程技术网

Linux Bash环境变量未更新

Linux Bash环境变量未更新,linux,git,bash,shell,Linux,Git,Bash,Shell,我在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'

我在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 GITBRANCH

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

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


如果您希望变量在任何地方都可用,可能
.profile
.bashrc
将是一个更好的地方。

在脚本前面加一个点运行脚本

. script

两步流程应能实现您的目标:

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

我很确定您不能以这种方式将正在运行的进程中的变量注入父进程的环境。
export
允许子进程而不是父进程使用变量。确实不应该使用美元符号,但这不会解决他的问题。出口什么并不重要;它被导出到一个脚本退出时就会消失的环境中。不幸的是,虽然这会使它最初可用,但在签出新分支时,它仍然不会得到更新?只需将完整路径放到git二进制文件中,否则会出现无休止的循环。你是对的;我正在测试一个解决方案,这时我正忙着做其他事情。我认为您还可以使用内置的
命令
来禁止函数查找,这样您就可以继续使用路径查找而不是硬编码路径。