bash 如果变量由函数设置
bash if variable set by function
我在 BASH 方面的经验有限,我正在寻找有关如何进行的一些指导,所以请多多包涵。
当我在 git 存储库中时,我正在尝试更改命令提示符,我可以使用我在 google 上找到的 post 来做到这一点,但我也想要根据回购的当前状态(干净、未跟踪的文件、修改的文件)添加颜色。
目前我的 .bashrc 文件末尾有这个:
parse_git_branch () {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/[]/'
}
modified () {
git status 2> /dev/null | grep -q modified
}
untracked () {
git status 2> /dev/null | grep -q Untracked
}
clean () {
git status 2> /dev/null | grep -q clean
}
NO_COLOR="\[3[0m\]"
GREEN="\[3[0;32m\]"
YELLOW="\[3[0;33m\]"
RED="\[3[0;31m\]"
set_color () {
if untracked ; then
echo $RED
elif modified ; then
echo $YELLOW
elif clean ; then
echo $GREEN
else
echo $NO_COLOR
fi
}
PS1="\u:\w$(set_color)$(parse_git_branch)$NO_COLOR> "
命令提示符发生了变化,但没有像我认为的那样改变颜色。
这是我得到的:
外部 git 回购 arod:~\[3[0m\]>
在 git 仓库中 arod:~/tos\[3[0;32m\][dev]>
我不确定如何获得我认为要评估的颜色,只是想从 BASH 经验比我多的人那里寻求一些指导。
如果有人正在寻找答案;或者至少是我使用的解决方案:
parse_git_branch () {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/[]/'
}
modified () {
git status 2> /dev/null | grep -q modified
}
untracked () {
git status 2> /dev/null | grep -q Untracked
}
clean () {
git status 2> /dev/null | grep -q clean
}
NO_COLOR="3[0m"
GREEN="3[0;32m"
YELLOW="3[0;33m"
RED="3[0;31m"
set_color () {
if untracked ; then
echo -e $RED
elif modified ; then
echo -e $YELLOW
elif clean ; then
echo -e $GREEN
else
echo -e $NO_COLOR
fi
}
PS1="\u:\w$(set_color)$(parse_git_branch)$NO_COLOR> "
问题中的代码与这个代码之间的主要区别是我确实添加了 -e 标志来回显,并从颜色变量中删除了 \'s。
希望这对某人有所帮助
编辑
在收到更多反馈后,现在是这样的:
parse_git_branch () {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/[]/'
}
no_color="3[0m"
green="3[0;32m"
yellow="3[0;33m"
red="3[0;31m"
set_color () {
case "$(git status 2> /dev/null)" in
*Untracked*)
printf '%b' "$red";;
*modified*)
printf '%b' "$yellow";;
*clean*)
printf '%b' "$green";;
*)
printf '%b' "$no_color";;
esac
}
PS1="\u:\w$(set_color)$(parse_git_branch)$no_color> "
所有这些都来自@Charles Duffy。
我唯一没有合并的是使用 tput 来获取颜色转义序列。
我在 BASH 方面的经验有限,我正在寻找有关如何进行的一些指导,所以请多多包涵。
当我在 git 存储库中时,我正在尝试更改命令提示符,我可以使用我在 google 上找到的 post 来做到这一点,但我也想要根据回购的当前状态(干净、未跟踪的文件、修改的文件)添加颜色。
目前我的 .bashrc 文件末尾有这个:
parse_git_branch () {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/[]/'
}
modified () {
git status 2> /dev/null | grep -q modified
}
untracked () {
git status 2> /dev/null | grep -q Untracked
}
clean () {
git status 2> /dev/null | grep -q clean
}
NO_COLOR="\[3[0m\]"
GREEN="\[3[0;32m\]"
YELLOW="\[3[0;33m\]"
RED="\[3[0;31m\]"
set_color () {
if untracked ; then
echo $RED
elif modified ; then
echo $YELLOW
elif clean ; then
echo $GREEN
else
echo $NO_COLOR
fi
}
PS1="\u:\w$(set_color)$(parse_git_branch)$NO_COLOR> "
命令提示符发生了变化,但没有像我认为的那样改变颜色。
这是我得到的:
外部 git 回购 arod:~\[3[0m\]>
在 git 仓库中 arod:~/tos\[3[0;32m\][dev]>
我不确定如何获得我认为要评估的颜色,只是想从 BASH 经验比我多的人那里寻求一些指导。
如果有人正在寻找答案;或者至少是我使用的解决方案:
parse_git_branch () {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/[]/'
}
modified () {
git status 2> /dev/null | grep -q modified
}
untracked () {
git status 2> /dev/null | grep -q Untracked
}
clean () {
git status 2> /dev/null | grep -q clean
}
NO_COLOR="3[0m"
GREEN="3[0;32m"
YELLOW="3[0;33m"
RED="3[0;31m"
set_color () {
if untracked ; then
echo -e $RED
elif modified ; then
echo -e $YELLOW
elif clean ; then
echo -e $GREEN
else
echo -e $NO_COLOR
fi
}
PS1="\u:\w$(set_color)$(parse_git_branch)$NO_COLOR> "
问题中的代码与这个代码之间的主要区别是我确实添加了 -e 标志来回显,并从颜色变量中删除了 \'s。
希望这对某人有所帮助
编辑
在收到更多反馈后,现在是这样的:
parse_git_branch () {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/[]/'
}
no_color="3[0m"
green="3[0;32m"
yellow="3[0;33m"
red="3[0;31m"
set_color () {
case "$(git status 2> /dev/null)" in
*Untracked*)
printf '%b' "$red";;
*modified*)
printf '%b' "$yellow";;
*clean*)
printf '%b' "$green";;
*)
printf '%b' "$no_color";;
esac
}
PS1="\u:\w$(set_color)$(parse_git_branch)$no_color> "
所有这些都来自@Charles Duffy。
我唯一没有合并的是使用 tput 来获取颜色转义序列。