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

当我使用 sudo su 时,用户 .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)\\]"

当我使用 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
  • setSUDO_PS1和 sudo 会将该值放入PS1
  • 使用sudo -i类似于su -(您需要将您的 shell 添加到sudoers文件中)
  • 检查变量并SUDO_COMMAND重置.bashrcPS1

保留的变量列表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)\\]"

相关内容