我有几个项目。我没有为每个项目的位置设置别名,而是在我导航到该特定目录时设置它。每个项目都是一个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里面?
谢谢!
答案 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)'
瞧!所以我可以将它扩展为一个事件陷阱机制,可以为我运行的任何命令调用它。