3

У меня есть функция, определенная в файле моего пользователя .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, а не моя?

Изменить: Кажется, что это происходит только после того, как я использую источник Python virtualenv. Если я получу sudo su, прежде чем я получу virtualenv, эта ошибка не произойдет.

2 ответа2

6

PS1 не сбрасывается с помощью sudo , он сохраняется по умолчанию. Функции являются частью среды bash, но не сохраняются в sudo . Вы можете сделать любую из нескольких вещей:

  • вместо этого используйте sudo su - так вы получите оболочку входа, которая будет сбрасывать PS1
  • установите env_reset для "очистки" среды, возможно, с помощью env_keep
  • установите SUDO_PS1 и sudo поместит это значение в PS1
  • используйте sudo -i который похож на su - (вам нужно добавить свою оболочку в файл sudoers )
  • проверьте переменную SUDO_COMMAND в вашем .bashrc и сбросьте PS1

Список переменных, которые хранит sudo (может отличаться в зависимости от версии, проверьте env.c в источнике):

DISPLAY COLORS LS_COLORS HOSTNAME PS1 PS2 TZ

Это жестко закодированный список, это не то же самое, что 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)\\]"
3

Вы когда-нибудь expor PS1 где-нибудь (например, в вашем Python virtualenv)? У меня всегда есть эта строка в моем .bashrc или .bash_profile:

export -n PS1 # unexport PS1 so sub-processes will not inherit it

Поэтому попробуйте export -n PS1 прежде чем sudo .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .