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

20

Estou tentando integrar o RVM ao gnome-terminal .

Por padrão, o gnome-terminal não inicia o bash como um shell de login. Eu habilitei run command as a login shell como sugerido em esta resposta sobre o mesmo tópico que configura o RVM, mas quando eu faço isso o .bashrc arquivo não é lido.

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

Este é o comportamento esperado?

    
por Arturo Herrero 05.05.2012 / 21:25

4 respostas

35

Sim, esse é o comportamento esperado.

O comportamento, resumindo, é o seguinte:

  • bash começou como um shell de login interativo: lê ~/.profile
  • bash iniciado como um shell interativo de não-login: lê ~/.bashrc

Leia o manual do bash sobre os 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 projeto.

Algumas explicações 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 shells que você usará são shells interativos.
  • Um shell não interativo é um shell com o qual você não pode interagir. Scripts shell são executados dentro de shells não interativos.
  • Um shell de login é o shell que é iniciado quando você faz login no sistema.
  • Um shell não-login é um shell que é iniciado após o processo de login.

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

Existe uma opção --login que fará o bash se comportar como se fosse um shell de login mesmo se iniciado após você ter efetuado login. Configurar o gnome-terminal para iniciar o bash como um shell de login significa que ele iniciará o bash usando o --login option.

Normalmente, você quer que o bash sempre leia ~/.bashrc em um shell interativo. Aqui está como eu recomendo fazer isso:

Crie um arquivo ~/.bash_profile . Se o bash for iniciado como um shell de login, ele procurará primeiro ~/.bash_profile antes de procurar por ~/.profile . Se o bash encontrar ~/.bash_profile , ele não lerá ~/.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 de não-login:

  1. ~/.bashrc

Você deve colocar coisas que são específicas do bash em ~/.bashrc e coisas que não são bash específicas em ~/.profile . Por exemplo, PATH entra em ~/.profile e HISTCONTROL entra em ~/.bashrc .

Observe que ~/.profile não é bash específico. Outros shells baseados em texto (por exemplo sh ou ksh) e shells gráficos (gnome) também lêem ~/.profile . É por isso que você não deve colocar coisas específicas de bash em ~/.profile .

    
por lesmana 05.05.2012 / 22:44
7

Esta não é uma decisão de design ruim, nem um bug, nem um comportamento esperado de shells e terminais

É meramente 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 de perfil .

  2. Selecione a guia Título e Comando .

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

É isso. Se você fizer isso com o perfil Default ou com qualquer perfil configurado para ser usado ao criar novos terminais, você receberá um shell de login.

Eu estou supondo que, sob o capô, essa opção provavelmente faz com que ele passe a opção -l para o shell.

    
por Guest 18.03.2015 / 00:32
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 construir rubis sem pedir 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 em localhost para um shell de login real (você pode ter que apt-get install ssh )

ssh rvmuser@localhost

4. Instalar rvm

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

5. Efetue logout e volte novamente para que todas as funções rvm sejam carregadas

exit

ssh rvmuser@localhost

6. Use rvm:)

    
por Michael Franzl 30.06.2014 / 08:15
0

É comum ao usar o bash colocar a inicialização do perfil em .bash_profile , que é somente leitura por bash no login, enquanto outros shells historicamente compartilham .profile . Isso permite que você coloque comandos bash-específicos em .bash_profile .

O uso do seguinte é comumente feito para extrair os aliases definidos em .bashrc :

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
    
por Rob Prentice 11.04.2016 / 02:56