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 --login
que 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 --login
opção
Geralmente, você deseja que o bash sempre leia ~/.bashrc
em um shell interativo. Aqui está como eu recomendo fazer isso:
Crie um ~/.bash_profile
arquivo Se o bash for iniciado como um shell de login, ele primeiro procurará ~/.bash_profile
antes 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:
~/.bash_profile
~/.profile
~/.bashrc
e se o bash for iniciado como um shell interativo sem logon:
~/.bashrc
Você deve colocar itens específicos do bash ~/.bashrc
e itens não específicos do bash ~/.profile
. Por exemplo, PATH
entra ~/.profile
e HISTCONTROL
entra ~/.bashrc
.
Observe que ~/.profile
nã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
.
~/.bashrc
primeiro lugar, no perfil. A falha está no rvm.~/.profile
.bashrc
relaçã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.bashrc
que dão.profile
como certo? E ao mesmo tempo, você quer que algumas coisas.bashrc
confiem em algo criado por.profile
? Nenhuma ordem de carregamento satisfará os dois cenários.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.
Vá para Editar -> Preferências do perfil .
Selecione a guia Título e comando .
Observe como a caixa de seleção Executar comando como shell de logon está desmarcada! Verifique-o.
É isso aí. Se você fizer isso no
Default
perfil 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
-l
opção para o shell.fonte
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 :)
fonte
É 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
:fonte