Configure o gnome-terminal para iniciar o bash como um shell de login, não lê .bashrc


24

Estou tentando integrar o RVM com o gnome-terminal .

Por padrão, o gnome-terminal não inicia o bash como um shell de login. Ativei run command as a login shellconforme sugerido nesta resposta sobre o mesmo tópico de configuração do RVM, mas quando faço isso, o .bashrcarquivo não é lido.

Por exemplo, eu crio uma variável de ambiente .bashrce, quando inicio um novo terminal gnome, não consigo lê-lo. Eu preciso executar explicitamente source .bashrcpara ler o arquivo.

Este é o comportamento esperado?

Respostas:


38

Sim, esse é o comportamento esperado.

O comportamento, em suma, é o seguinte:

  • bash iniciado como um shell de logon interativo: lê ~/.profile
  • bash iniciado como um shell interativo sem logon: lê ~/.bashrc

Leia o manual do bash sobre arquivos de inicialização para obter mais detalhes.

Pessoalmente, acho que esse comportamento é estranho e ainda não encontrei uma racionalização para essa decisão de design.


Alguma explicação da terminologia:

  • Um shell interativo é um shell com o qual você pode interagir, o que significa que você pode digitar comandos nele. A maioria das conchas que você usará são conchas interativas.
  • Um shell não interativo é um shell com o qual você não pode interagir. Os scripts de shell são executados dentro de shells não interativos.
  • Um shell de login é o shell iniciado quando você faz login no seu sistema.
  • Um shell sem login é um shell iniciado após o processo de login.

A maioria dos shells que você vê são shells interativos sem login . Isto é especialmente verdade se você estiver executando um ambiente gráfico como o gnome, porque o gnome é o "shell de login". Qualquer sessão bash iniciada dentro do gnome é um shell que não é de login. Se você quiser ver um shell de logon interativo real, acesse um console virtual (usando Ctrl+Alt+F1) e efetue login usando seu nome de usuário e senha. Esse é um shell de basquete de logon interativo real. Você pode voltar ao shell gráfico usando Ctrl+Alt+F7.

Existe uma opção --loginque fará o bash se comportar como se fosse um shell de login, mesmo que iniciado após o seu login. Configurar o gnome-terminal para iniciar o bash como um shell de login significa que ele iniciará o bash usando a --loginopção


Geralmente, você deseja que o bash sempre leia ~/.bashrcem um shell interativo. Aqui está como eu recomendo fazer isso:

Crie um ~/.bash_profilearquivo Se o bash for iniciado como um shell de login, ele primeiro procurará ~/.bash_profileantes de procurar ~/.profile. Se o bash encontrar ~/.bash_profile, ele não será lido ~/.profile.

Coloque as seguintes linhas em ~/.bash_profile:

[ -f "$HOME/.profile" ] && source "$HOME/.profile"
[ -f "$HOME/.bashrc" ] && source "$HOME/.bashrc"

Agora, se o bash for iniciado como um shell de login interativo, ele lerá os seguintes arquivos:

  1. ~/.bash_profile
  2. ~/.profile
  3. ~/.bashrc

e se o bash for iniciado como um shell interativo sem logon:

  1. ~/.bashrc

Você deve colocar itens específicos do bash ~/.bashrce itens não específicos do bash ~/.profile. Por exemplo, PATHentra ~/.profilee HISTCONTROLentra ~/.bashrc.

Observe que ~/.profilenão é específico do bash. Outros shells baseados em texto (por exemplo, sh ou ksh) e shells gráficos (gnome) também são lidos ~/.profile. É por isso que você não deve colocar itens específicos do bash ~/.profile.


1
+1. Obrigado, isso estava me deixando louca ... :-)
richsage

1
mywiki.wooledge.org/DotFiles explica um pouco da história de como é. A principal razão para esse problema com o rvm é que o rvm coloca o código, que deve estar em ~/.bashrcprimeiro lugar, no perfil. A falha está no rvm.
Geirha

Como por @geirha eles deveriam ter usado~/.profile
sanmai

A lógica é que o script de perfil pode controlar a avaliação em .bashrcrelação ao que ele precisa fazer. Se o shell interativo sempre ler .bashrc, isso deve ser antes ou depois .profile? E se você quiser configurar algumas coisas .bashrcque dão .profilecomo certo? E ao mesmo tempo, você quer que algumas coisas .bashrcconfiem em algo criado por .profile? Nenhuma ordem de carregamento satisfará os dois cenários.
Kaz

11

Esta não é uma má decisão de projeto, nem um bug, nem um comportamento esperado de shells e terminais

É apenas um valor padrão infeliz de uma opção de configuração por perfil no Gnome Terminal, que você pode corrigir facilmente.

  1. Vá para Editar -> Preferências do perfil .

  2. Selecione a guia Título e comando .

  3. Observe como a caixa de seleção Executar comando como shell de logon está desmarcada! Verifique-o.

É isso aí. Se você fizer isso no Defaultperfil ou em qualquer perfil que esteja configurado para ser usado na criação de novos terminais, você obterá um shell de login.

Suponho que, sob o capô, essa opção provavelmente faça com que ela passe a -lopção para o shell.


0

Eu tive a mesma pergunta e encontrei uma solução: Basta usar o SSH para um shell de login real!

1. Como superusuário, crie um usuário do sistema rvm dedicado para isolamento completo e atribua uma senha:

sudo su

useradd -m rvmuser

passwd rvmuser

2. Instale dependências para que o rvm possa criar rubis sem solicitar a senha do superusuário:

apt-get install curl gawk libreadline6-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 autoconf libgdbm-dev libncurses5-dev automake bison libffi-dev

3. SSH no localhost para um shell de login real (talvez seja necessário apt-get install ssh)

ssh rvmuser@localhost

4. Instale o rvm

\curl -sSL https://get.rvm.io | bash -s stable

5. Faça logoff e logon novamente para que todas as funções do rvm sejam carregadas

exit

ssh rvmuser@localhost

6. Use rvm :)


0

É comum usar o bash para inserir a inicialização do perfil .bash_profile, que é lida apenas pelo bash no logon, enquanto outros shells são compartilhados historicamente .profile. Isso permite que você insira comandos específicos do bash .bash_profile.

Geralmente, é utilizado o seguinte para obter os aliases definidos em .bashrc:

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.