Adicionando um diretório ao $ PATH no CentOS?

84

Acabamos de instalar nossos novos servidores e estamos executando o CentOS em todos eles. Após a instalação bem-sucedida do Ruby Enterprise Edition, agora eu gostaria de adicionar o /usr/lib/ruby-enterprise/bindiretório REE / bin (localizado em ) para torná-lo o interpretador Ruby padrão no servidor.

Eu tentei o seguinte, que apenas o adiciona à sessão atual do shell:

export PATH=/usr/lib/ruby-enterprise/bin:$PATH

Qual seria a abordagem correta para adicionar permanentemente esse diretório ao $ PATH para todos os usuários . No momento, estou logado como root.

Desde já, obrigado!

vonconrad
fonte

Respostas:

116

Não é uma boa ideia editar /etc/profilecoisas como essa, porque você perderá todas as alterações sempre que o CentOS publicar uma atualização para este arquivo. É exatamente /etc/profile.dpara isso:

# echo 'pathmunge /usr/lib/ruby-enterprise/bin' > /etc/profile.d/ree.sh
# chmod +x /etc/profile.d/ree.sh

Faça login novamente e aproveite o PATH atualizado (com segurança):

# echo $PATH
/usr/lib/ruby-enterprise/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
# which ruby
/usr/lib/ruby-enterprise/bin/ruby

Em vez de efetuar login novamente, você pode recarregar o perfil:

# . /etc/profile

Isso atualizará a $PATHvariável.

Mike
fonte
1
~/.profileé outra opção válida também
Zypher
4
Sim, para um único usuário. Mas a questão era alterar o PATH para todos os usuários.
Mike
2
@ Mike O que é esse comando pathmunge?
Nickolai Leschov
@NickolaiLeschov Tenho certeza de que apenas anexa um caminho para $ PATH.
20514 Mike
@NickolaiLeschov ele uma função que é definida em / etc / perfil
CrazyPheel
11

Depois de seguir o conselho de fmonk, fiz o check-out /etc/bashrc, onde notei que "Coisas do ambiente entram em / etc / profile". Eu comecei a procurar /etc/profile, vi o seguinte:

pathmunge () {
    if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then
       if [ "$2" = "after" ] ; then
          PATH=$PATH:$1
       else
          PATH=$1:$PATH
       fi
    fi
}

[...]

# Path manipulation
if [ "$EUID" = "0" ]; then
    pathmunge /sbin
    pathmunge /usr/sbin
    pathmunge /usr/local/sbin
fi

Para resolver meu problema, simplesmente adicionei pathmunge /usr/lib/ruby-enterprise/binembaixo da instrução if. Isso resolveu meu problema.

vonconrad
fonte
Alguém poderia explicar o que "$EUID" = "0"significa neste contexto?
Eli
EUID 0 significa que o usuário é root.
precisa saber é o seguinte
6
Você deveria ter usado o /etc/profile.d. Veja minha resposta abaixo.
Mike
Considere aceitar a resposta @MikeConigliaro como a correta. O caminho dele é o correto. Foi desenvolvido para funcionar dessa maneira. Dê uma olhada nos arquivos da /etc/profile.d/pasta e você notará. Além disso, como ele disse, uma atualização do sistema pode desfazer sua solução.
Caio Cunha
4

"Um shell de login interativo é iniciado após um login bem-sucedido, usando / bin / login, lendo o arquivo / etc / passwd. Essa chamada de shell normalmente lê / etc / profile e seu equivalente privado ~ / .bash_profile na inicialização.

Um shell interativo sem logon normalmente é iniciado na linha de comando usando um programa shell (por exemplo, [prompt] $ / bin / bash) ou pelo comando / bin / su. Um shell interativo sem login também é iniciado com um programa de terminal, como xterm ou konsole, a partir de um ambiente gráfico. Esse tipo de chamada de shell normalmente copia o ambiente pai e, em seguida, lê o arquivo ~ / .bashrc do usuário para obter instruções adicionais de configuração de inicialização. " Http://www.linuxfromscratch.org/blfs/view/6.3/postlfs/profile.html

Portanto, eu não colocaria variáveis ​​de ambiente no bashrc, porque isso não é apenas contra a convenção comum, mas você também perderá suas variáveis ​​bashrc ao chamar um terminal de um ambiente gráfico da área de trabalho.

Em Redhat no /etc/profileeu encontrei este comentário:

"Aliases e funções em todo o sistema devem entrar em / etc / bashrc. Variáveis ​​de ambiente pessoais e programas de inicialização devem entrar em ~ / .bash_profile. Aliases e funções pessoais devem estar em ~ / .bashrc."

Portanto, se você deseja definir variáveis ​​de ambiente com base no usuário, faça-o no arquivo .bash_profile do usuário.

Indo para o que .bash_profileeu li:

"Variáveis ​​de ambiente pessoal e programas de inicialização.

Aliases e funções pessoais devem estar em ~ / .bashrc. Variáveis ​​de ambiente de todo o sistema e programas de inicialização estão em / etc / profile. Os aliases e funções do sistema estão em / etc / bashrc. "

Conclusão
Se você deseja que apenas o root veja programas residindo, por exemplo, em / sbineu adicionaria esse caminho ao .bash_profilearquivo raiz . Mas se você quiser cada usuário para ver o que raiz programas específicos estão instalados em sua caixa Gostaria de colocar /sbinem /etc/.profile. Agora, todo usuário pode usar o preenchimento de guias para procurar programas específicos de raiz e, se necessário, elevar os direitos.

Caso especial: SSH
Quando o ssh é iniciado com uma linha de comando, um shell de login interativo é iniciado. Mas neste caso /etc/profilenão é lido. Quando defini variáveis ​​de ambiente no .bash_profilearquivo de cada usuário, ele trabalhou com o ssh.

campos de malha
fonte
2

SORRY interpretou mal a pergunta, conforme a seguir é para o perfil de um USUÁRIO, deixando-a no caso de ajudar alguém

modificar .bash_profile

nano ~/.bash_profile

em algum lugar do arquivo, adicione / modifique seus caminhos separados por:

 PATH=$PATH:$HOME/bin:/your/path
 export PATH

então recarregue seu perfil

source ~/.bash_profile

ou saia e faça login novamente

se você marcar PATH, ele deverá incluir os novos caminhos adicionados

echo $PATH
GiorgosK
fonte
1

Você pode definir variáveis ​​de ambiente em um arquivo .rc; para shells bash (acredito ser o mais comum e o padrão no CentOS), cada usuário possui um arquivo chamado .bashrc em seu diretório pessoal.

Inclua o comando PATH = / usr / lib / ruby-enterprise / bin: $ PATH neste arquivo para configurá-lo para qualquer usuário em particular.

Para defini-lo para todos os usuários (como você mencionou), altere-o em / etc / bashrc (o .bashrc padrão no diretório inicial de cada usuário deve originar esse arquivo, mas você deve verificar isso duas vezes).


fonte