当我 sudo su 时,我用户的 .bashrc 中定义的函数会导致错误

sky*_*ler 3 sudo bash python bashrc

我在用户的 .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)\\]"
Run Code Online (Sandbox Code Playgroud)

当我 sudo 到 su 时,看起来我的 PS1 被结转了,并且在每个命令之后我都会收到错误bash: parse_git_branch: command not found

我可以更改什么,以便当我对另一个用户 sudo 时,使用其 PS1 而不是我用户的 PS1?

编辑:这似乎只发生在我使用源 Python virtualenv 之后。如果我在获取 virtualenv 之前 sudo su ,则不会发生此错误。

mr.*_*tic 7

PS1没有被重置sudo,默认情况下保留。函数是 bash 环境的一部分,但不被sudo. 您可以执行以下任一操作:

  • 而是使用,sudo su -以便您获得登录外壳,这将重置PS1
  • 设置env_reset为“清理”环境,可能与env_keep
  • setSUDO_PS1和 sudo 会将该值放入PS1
  • 使用sudo -i类似于su -(您需要将您的外壳添加到sudoers文件中)
  • 检查变量SUDO_COMMAND在你.bashrc和复位PS1

sudo保留的变量列表(可能因版本而异,请检查env.c源代码)包括:

DISPLAY COLORS LS_COLORS HOSTNAME PS1 PS2 TZ
Run Code Online (Sandbox Code Playgroud)

这是一个硬编码列表,它与env_keep(即“ env_keep -=”不会改变它)不同。

sudo -V以 root 身份运行以获取保留或删除的完整变量列表(sudo版本 >= v1.7)。

最后一个建议,你可以PS1通过检查函数是否存在来使你的更健壮:

PS1="\\[$(tput setaf 7)\\]\\w \$(type -t parse_git_branch >/dev/null && parse_git_branch)> \\[$(tput sgr0)\\]"
Run Code Online (Sandbox Code Playgroud)