Perdendo informações do ambiente ao usar / usr / bin / sudo e / bin / bash

1

Minha pergunta é por que eu perco informações do ambiente como $PATH ao executar o seguinte comando:

/usr/bin/sudo -H -u <user> /bin/bash -l -c '<command>'

Estou tentando adicionar o caminho /mnt/anaconda a esse comando. Então, o que tentei fazer foi adicionar o ~/.bashrc para o usuário:

export PATH="/mnt/anaconda/bin:$PATH"

Também configurado em visudo

Defaults        env_keep = "PATH"

Mas nenhuma dessas mudanças entrou em vigor. Vocês têm alguma sugestão?

    
por felipeclopes 03.08.2015 / 19:42

1 resposta

3

Quando você executa um comando na opção bash via -c , um shell não interativo é gerado. O arquivo ~/.bashrc é fornecido para shells interativos que não são de login (e também para shells interativos de login, provenientes de ~/.profile ). O ponto principal é a interatividade.

O arquivo ~/.bashrc tem o seguinte snippet no começo:

case $- in
    *i*) ;;
      *) return;;
esac

Isso significa verificar as opções do shell por $- , se o shell não for interativo (sem i flag), saia do arquivo ~/.bashrc .

Então, como você está gerando um shell não interativo via bash -c , o PATH que você definiu no final não será lido.

Você tem poucas opções:

  • Use a opção -i de bash para que bash se comporte como um shell interativo e leia o arquivo ~/.bashrc :

    /usr/bin/sudo -H -u <user> /bin/bash -i -c '<command>'
    
  • Como você estava usando a opção -l , que diz a bash para se comportar como um shell de login, você pode colocar PATH em ~/.profile para que seja source -ed. Observe que isso pode não ser uma boa opção, considerando sua necessidade.

  • Outra opção muito ruim seria colocar PATH no início do arquivo ~/.bashrc , antes do snippet de verificação de interatividade.

por heemayl 03.08.2015 / 21:56