Função definida no .bashrc do meu usuário provoca um erro quando eu sudo su

3

Eu tenho uma função definida no arquivo .bashrc do meu usuário que exibe o nome da minha ramificação atual no meu prompt de comando:

parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/()/'
}
PS1="\[$(tput setaf 7)\]\w \$(parse_git_branch)> \[$(tput sgr0)\]"

Quando eu sudo para su, parece que meu PS1 é transportado, e após cada comando eu recebo o erro bash: parse_git_branch: command not found .

O que eu posso mudar para que, quando eu sudo para outro usuário, seu PS1 seja usado e não o do meu usuário?

Edit: Parece que isso só acontece depois que eu uso a fonte de um virtualenv Python. Se eu sudo su antes de eu fonte o virtualenv, esse erro não ocorre.

    
por skyler 21.03.2013 / 16:26

2 respostas

3

Você já usou expor PS1 em algum lugar (por exemplo, em seu Python virtualenv )? Eu sempre tenho essa linha no meu .bashrc ou .bash_profile :

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

Então, tente export -n PS1 antes de você sudo .

    
por 22.03.2013 / 09:38
5

PS1 não está sendo redefinido por sudo , ele é mantido por padrão. As funções fazem parte do ambiente bash, mas não são preservadas por sudo . Você pode fazer várias coisas:

  • use sudo su - para obter um shell de login que redefinirá PS1
  • defina env_reset para "limpar" o ambiente, possivelmente com env_keep
  • definir SUDO_PS1 e sudo colocará esse valor em PS1
  • use sudo -i , que é semelhante a su - (você precisará adicionar seu shell ao arquivo sudoers )
  • verifique a variável SUDO_COMMAND em seu .bashrc e redefina PS1

A lista de variáveis que sudo mantém (pode variar por versão, verifique env.c na origem) inclui:

DISPLAY COLORS LS_COLORS HOSTNAME PS1 PS2 TZ

Esta é uma lista codificada, não é a mesma coisa que env_keep (ou seja, " env_keep -= " não irá alterá-la).

Execute sudo -V como root para obter uma lista completa de variáveis preservadas ou removidas (para sudo version > = v1.7).

Uma sugestão final, você poderia tornar seu PS1 mais robusto, verificando se a função existe:

PS1="\[$(tput setaf 7)\]\w \$(type -t parse_git_branch >/dev/null && parse_git_branch)> \[$(tput sgr0)\]"
    
por 21.03.2013 / 20:36