我在用户的 .bashrc 文件中定义了一个函数,它在命令提示符下显示我当前的 git 分支名称:
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
PS1="\\[$(tput setaf 7)\\]\\w \$(parse_git_branch)> \\[$(tput sgr0)\\]"
当我使用 sudo 执行 su 时,看起来我的 PS1 被结转了,并且每次执行完命令后我都会收到错误bash: parse_git_branch: command not found
。
我可以进行哪些更改,以便当我对另一个用户进行 sudo 时,使用它的 PS1 而不是我的用户的 PS1?
编辑:似乎只有在我使用 source Python virtualenv 后才会发生这种情况。如果我在 source virtualenv 之前使用 sudo su,则不会发生此错误。
答案1
你是否曾expor PS1
在某个地方(例如在你的Python 虚拟环境)?我的.bashrc
或中总是有这一行.bash_profile
:
export -n PS1 # unexport PS1 so sub-processes will not inherit it
所以export -n PS1
先 尝试 再说sudo
.
答案2
PS1
不会被重置sudo
,默认情况下会保留。函数是 bash 环境的一部分,但不会被保留sudo
。您可以执行以下任一操作:
- 而是使用
sudo su -
这样你就会得到一个登录 shell,它将重置PS1
- 设置
env_reset
为“清理”环境,可能env_keep
- set
SUDO_PS1
和 sudo 会将该值放入PS1
- 使用
sudo -i
类似于su -
(您需要将您的 shell 添加到sudoers
文件中) - 检查变量并
SUDO_COMMAND
重置.bashrc
PS1
保留的变量列表sudo
(可能因版本而异,请检查env.c
源代码)包括:
DISPLAY COLORS LS_COLORS HOSTNAME PS1 PS2 TZ
这是一个硬编码列表,它与 不同env_keep
(即“ env_keep -=
”不会改变它)。
以 root 身份运行sudo -V
以获取保留或删除的变量的完整列表(针对sudo
版本 >= v1.7)。
最后一个建议,你可以PS1
通过检查函数是否存在来使你的函数更加健壮:
PS1="\\[$(tput setaf 7)\\]\\w \$(type -t parse_git_branch >/dev/null && parse_git_branch)> \\[$(tput sgr0)\\]"