更改目录时,bashrc不在函数中导出变量

时间:2014-09-11 18:48:03

标签: bash ps1

我有几个项目。我没有为每个项目的位置设置别名,而是在我导航到该特定目录时设置它。每个项目都是一个git repo,我已经有了一个机制,当我导航到它时,它将当前分支名称附加到$ PS1。

在我的.bashrc中,我调用一个函数:parse_git_branch追加到命令提示符:

case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h:\w\a\]$PS1\$(parse_git_branch) "
    ;;  
*)
;;  
esac

parse_git_branch在我的.basrhc:

的末尾定义
function parse_git_branch {
    GIT_BRANCH=$(git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ \[\1\]/')
    if [[ -n $GIT_BRANCH ]];then
            source $HOME/bin/cur
    fi
    echo $GIT_BRANCH
}

如果GIT_BRANCH不为空,我会提供一个简单的脚本〜/ bin / cur,它为pwd设置别名:

#!/bin/bash
echo "got here!"
shopt -s expand_aliases
alias current="cd $(pwd)"

当获得cur时,不设置别名。但是,调试消息确实正确显示。

我相信这是因为shell脚本运行"外部"我目前的环境。从命令行调用source cur时设置别名。

那么,为什么在从" parse_git_branch"调用时没有设置别名?在我的.bashrc里面?

谢谢!

2 个答案:

答案 0 :(得分:2)

这里的问题是在子shell中运行parse_git_branch的$()的用法。因此,在打开的终端中找不到别名电流,因为父进程看不到别名。

case "$TERM" in
  xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h:\w\a\]$PS1\$(parse_git_branch) "
    source $HOME/bin/cur
    ;;  
*)
;;

应该有用。

答案 1 :(得分:0)

好的,我明白了。这里的问题并不是我试图这样做的原因。这个问题在于我试图从它产生的子shell环境中影响父shell环境($()命令语法bart所说的。) 因此,解决方法是允许来自两个环境的通信。为此,我只使用了文件系统。这就是我的所作所为:

.bashrc不需要做太多改变,但它也不必采购任何东西:

parse_git_branch {
  GIT_BRANCH=$(git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ \[\1\]/')
  if [[ -n $GIT_BRANCH ]];then
        $HOME/bin/cur -p
  fi
  echo $GIT_BRANCH
}

我修改〜/ bin / cur只是简单地写或读fs,而不是试图修改任何环境:

#!/bin/bash
put() {
  echo $(pwd) > $HOME/.tmpalias
}
get() {
  cat $HOME/.tmpalias
}

case "$1" in
 *p) 
   put
   ;;
 *g) 
   get 
   ;;  
esac

cur脚本会在调用时写入或读取文件.tmpalias(我没有打扰参数和文件等,因为这只在两个地方调用。

然后我将以下内容添加到我的.bash_aliases文件中:

alias current='cd $(cur -g)'

瞧!所以我可以将它扩展为一个事件陷阱机制,可以为我运行的任何命令调用它。