/ etc / profile não está sendo originado

45

Para o 11.04, fiz uma nova instalação do meu sistema. Parte dessa instalação foi instalar rvm , que enfia um rvm.shno /etc/profile.d/. Isso não funciona, pois /etc/profile(que carrega cada + r in /etc/profile.d/*.sh) não está sendo carregado. De acordo com a documentação, o perfil é originado apenas se o bash for executado no logon. Para verificar isso, invoquei bash --login, após o qual rvmestava disponível.

Isso funcionou para mim nas versões anteriores do Ubuntu sem nenhuma configuração. Ou seja, uma nova instalação da 10.10 irá originar corretamente o perfil / .d.

Minha pergunta é: existe algo que estou fazendo de errado ou há algumas novas suposições sendo feitas em Natty que quebraram isso? Minha solução atual é source /etc/profileem ~/.bashrc(que é terrível como o perfil destina-se a carga antes bashrc de, mas faz o truque).

Marc
fonte

Respostas:

52

Por padrão, o gnome-terminal não inicia o bash como um shell de login (suponho que você queira dizer o bash iniciado dentro de um terminal do gnome). Isso significa que o bash não lê /etc/profileou ~/.profile. Como você observou corretamente, o bash lerá esses arquivos se iniciado como um shell de login.

A solução rápida para o seu problema é configurar o gnome-terminal para iniciar o bash como um shell de login, para que ele seja lido /etc/profile. Para fazer isso, você deve habilitar "Executar comando como um shell de login" nas "Preferências de perfil" do gnome-terminal, acessíveis no menu Editar.

Eu não recomendo fazer isso, porque atrapalha a distinção entre ~/.profilee ~/.bashrc. Idealmente ~/.profile, faça o que for necessário apenas uma vez, durante o login, enquanto o ~/.bashrcque for necessário toda vez que o bash for iniciado.

Há uma pergunta e resposta no superusuário falando sobre a diferença entre bashrc e profile . Leia lá para mais informações.

Na descrição do seu problema, parece que o script rvm precisa ser carregado apenas uma vez, durante o login. Até onde eu sei, o Ubuntu configurou o login gráfico para ler /etc/profile/e ~/.profile. Isso significa que, após o logout e o logon uma vez, o script rvm deve estar ativo. Se ainda assim não funcionar, talvez o script rvm precise ser carregado para cada sessão do bash. Se for esse o caso, então bashrcé o local mais apropriado para o script.

lesmana
fonte
Definir 'comando de execução como um shell de login' realmente foi carregado /etc/profile(e, portanto, os .d). Obrigado pela explicação - parece que isso requer acompanhamento com o pessoal do rvm.
Marc
7
O Ubuntu 11.04 parece não ler /etc/profilee ~/.profiledurante o login. É estranho, porque sempre funcionou com versões mais antigas. Eu acho que isso não é uma solução, mas uma solução alternativa.
Luca
2
@lesmana Existe uma maneira de habilitar "Executar comando como um shell de login" na CLI em vez da GUI? Estou em um servidor remoto e não consigo encaminhar o X localmente.
Waseem
5

Existe, no entanto, um arquivo /etc/bash.bashrc que é lido pelo gnome-terminal e é o "arquivo .bashrc de todo o sistema para shells bash (1) interativos".

Minha chamada para a função rvm [[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm", foi lá e funciona muito bem para os dois usuários desse sistema.

Dmitri
fonte
O gnome-terminal não faz nada disso. O gnome-terminal executa o bash (ou qualquer que seja o seu shell de login definido no banco de dados passwd) no modo interativo, e o bash iniciado lê interativamente /etc/bash.bashrc. Bem, pelo menos no Debian / Ubuntu. O Bash normalmente não lê um bashrc em todo o sistema; O debian corrigiu isso para isso.
Geirha # 13/12
@geirha: dmitri @ Eos: ~ $ uname -a Linux Eos 3.0.0-16-generic # 29-Ubuntu SMP Ter 14 de fevereiro 12:48:51 UTC 2012 x86_64 x86_64 x86_64 GNU / Linux dmitri @ Eos: ~ $ cat / etc / bash.bashrc # Arquivo .bashrc em todo o sistema para shells interativos do bash (1). # Para ativar também as configurações / comandos deste arquivo para shells de login, # este arquivo deve ser originado em / etc / profile. # Se não correr de forma interativa, não fazer nada [-z "$ PS1"] && retorno .....
Dmitri
2
Sim, obviamente, o gnome-terminal chama o bash para ler esse arquivo: se o seu shell for ksh, o gnome-terminal não lerá esse arquivo, não é? Posso sugerir que procure a palavra "pedante" no dicionário antes de continuar usando frases provocativas como "não faz nada disso".
Dmitri
4

A instalação do RVM como multiusuário requer que o usuário execute este comando:

(porque o Ubuntu não fornece /etc/profile.d no login)

echo '[[ -s "/etc/profile.d/rvm.sh" ]] && . "/etc/profile.d/rvm.sh" # Load RVM function' >> ~/.bashrc
user50486
fonte
3
O Ubuntu faz a origem dos arquivos /etc/profile.d/durante o login, porque o padrão /etc/profilepercorre e origina os arquivos /etc/profile.d/. No entanto, se isso rvm.shcontiver código para shells interativos, como funções ou aliases, não será necessário obtê-los de origem /etc/profile. Setup para sessões festança interativos devem estar em .bashrc.
geirha
0

se você possui ZSH ou OH-MY-ZSH, seu perfil é / etc / zprofile

Hadi Farnoud
fonte
0

Na verdade, encontrei aqueles que não gostam de reiniciar completamente suas caixas, a menos que seja absolutamente necessário o seguinte ...

Você não precisa reiniciar a máquina inteira para que as alterações /etc/profileentrem em vigor. Tudo o que você precisa é reiniciar a GUI do XWindows Desktop para reler as configurações (como faria se fosse iniciado como parte de uma reinicialização em todo o sistema).

Para mim, eu uso o xUbuntu, que usa o LightDM, mas você pode usar o executável que chama sua área de trabalho atual.

Primeiro, você não pode usar um emulador de terminal de dentro da própria GUI da área de trabalho para fazer isso (pelo menos não com o LightDM). É necessário usar o SSH ou um console secundário (se você pressionar Ctrl + Alt e pressionar uma tecla F ou tecla numérica você deve sair do seu login ou tela da área de trabalho gráfica para uma janela simples do terminal). Também sugiro que você feche qualquer área de trabalho remota como o VNC se estiver usando SSH (obviamente o SSH pode ser conectado, você não deseja que uma janela aberta do VNC esteja pesquisando o display 0 enquanto estiver tentando reiniciar, pois isso pode travar a reinicialização enquanto espera que você encerre a sessão do VNC).

Faço isso o tempo todo com o SSH e é um grande salva-vidas, especialmente quando você não está fisicamente na sua máquina e não sente vontade de esperar por uma reinicialização completa e reconectar :-D

Agora, a parte fácil, uma vez em um terminal "secundário" ou problema de SSH: (Sim, isso acabará com sua sessão atual, certifique-se de que você não se importe, salve documentos ou trabalhos abertos)

sudo service lightdm restart

espere um minuto enquanto ela mata a área de trabalho e a inicia novamente (isso pode levar alguns segundos bons, pois as coisas são interrompidas e depois executadas novamente no início)

É isso aí, agora, quando você voltar ao console 0 ou usar o VNC para conectar-se novamente, será recebido pelo prompt de login e logon normalmente e se você abrir um emulador de terminal e emitir seu comando, deverá agora não tenha problemas, pois tudo foi recuperado como se você tivesse reiniciado completamente a máquina.

Lembre-se: se você emitir sudo service lightdm restart[ou stop, o que startfor] dentro do próprio ambiente de área de trabalho usando um emulador de terminal, o comando ficará travado e nada parecerá estar acontecendo. Isso ocorre porque você está atualmente usando esse console (também conhecido como vídeo) 0 e, portanto, ele não pode ser desativado completamente e voltar ao modo de espera, pois espera que a área de trabalho não esteja em uso antes de executar o comando.

Última nota: Eu não tentei emitir a reinicialização no ambiente a partir da área de trabalho em um emulador de terminal e depois mudar para outro console que poderá reiniciá-lo, mas se você já estiver trocando o console, por que não executar o comando de lá como deveria ser de qualquer maneira?

Pária
fonte
-4

eco ".profile" >> ~ / .bashrc

E então abra outra janela. Eu acho que essa é a abordagem fácil.

chris
fonte
1
Desde as .profilefontes padrão .bashrc, isso resultaria em um loop para a maioria dos usuários.
Muru