Entendendo a Ordem de Carregamento do .bashrc e .profile - Quando as Configurações Não São Aplicadas

Entendendo a Ordem de Carregamento do .bashrc e .profile - Quando as Configurações Não São Aplicadas

O que você vai conseguir fazer

  • Explicar quando o `~/.bashrc` e o `~/.profile` são lidos
  • Achar e corrigir o motivo de os aliases sumirem via SSH
  • Aplicar uma alteração em um terminal já aberto com `source ~/.bashrc`

Pré-requisitos (leia estes primeiro)

O Que Você Vai Aprender

Linny-senpai, Minhas Configurações Não Estão Aparecendo

Conclusão: .bashrc e .profile são lidos em momentos diferentes. É por isso que aliases somem via SSH.

Lina: Linny-senpai, adicionei um alias no .bashrc. Ele continua sem funcionar mesmo depois de eu reabrir o terminal.
Veterano Linny: Esse é um problema comum. Qual dos dois arquivos é lido, e quando. Entenda isso e o problema acaba.

Este artigo responde estas perguntas:

  • Qual é a diferença entre .bashrc e .profile?
  • Por que minhas configurações não aparecem depois de editar um arquivo?
  • Por que meus aliases somem após uma conexão SSH?
  • Existe um jeito de aplicar as configurações sem reiniciar?

As palavras usadas aqui

  • Shell: o programa que lê o seu comando e o executa. Este artigo assume o bash.
  • Arquivo de configuração: um arquivo com instruções que o shell lê ao iniciar. .bashrc e .profile são dois deles.
  • Alias: um nome curto que você dá a um comando mais longo. Algumas pessoas chamam de atalho.

Um arquivo cujo nome começa com . se chama arquivo oculto. O ls não o mostra. Somente o ls -a mostra.

Primeiro, o caminhoUma sequência de texto que descreve a localização de um arquivo ou diretório. de volta

Este artigo edita arquivos de configuração. Um erro em um deles pode gerar uma mensagem de erro toda vez que você abre um terminal.

Então copie os arquivos antes de editar.

$ cp ~/.bashrc ~/.bashrc.bak
$ cp ~/.profile ~/.profile.bak

Se o seu sistema tiver um ~/.bash_profile, copie esse arquivo também.

Se algo der errado, restaure a cópia.

$ cp ~/.bashrc.bak ~/.bashrc
$ source ~/.bashrc

Se o terminal continuar funcionando e apenas mostrar um erro, essas duas linhas resolvem.

Se o terminal abrir e fechar na hora, você pode iniciar um shell que ignora os arquivos de configuração. De outro terminal, digite isto:

$ bash --norc --noprofile

A partir daí, o cp acima restaura o seu arquivo.

O Papel do .bashrc vs .profile

Conclusão: O ~/.bashrc é lido quando você abre um terminal. O ~/.profile é lido no login, como em uma conexão SSH.

Lina: .bashrc e .profile têm nomes parecidos. Não consigo saber em qual devo escrever.
Veterano Linny: Comece descobrindo quando cada um é lido. Isso vem primeiro.
Arquivo Quando É Carregado
~/.bashrc Shell interativo (quando você abre um terminal normal)
~/.profile Shell de login (quando você conecta via SSH ou faz login)
~/.bash_profile Shell de login (tem prioridade sobre ~/.profile)

O ~ representa o seu diretórioUm local que organiza arquivos. É a mesma ideia da "pasta" do Windows ou macOS. pessoal. Então ~/.bashrc quer dizer "o .bashrc dentro do seu diretório pessoal".

Se ~/.bash_profile existe, ~/.profile não é carregado. Apenas um deles executa por login.

Entendendo os Dois Tipos de Shells

Conclusão: Um shell de login inicia em uma conexão SSH. Ele lê o /etc/profile e o ~/.bash_profile.

Lina: Qual é a diferença entre um "shell de login" e um "shell interativo"?
Veterano Linny: Depende de como o bash foi iniciado. Um terminal de desktop e uma conexão SSH iniciam tipos diferentes de shell.

Os dois nomes, organizados antes

  • Shell de login: o shell que inicia quando você entra com usuário e senha. O SSH é o caso clássico.
  • Shell interativo: o shell em que você digita comandos. Também é chamado de shell conversacional.
  • O terminal que você abre no desktop é um shell interativo que não é de login.

Shell de Login

Iniciado nestas situações:

Arquivos carregados:

  1. /etc/profile
  2. ~/.bash_profile (se existir) ou ~/.profile

Shell Interativo Não-Login

Iniciado nestas situações:

  • Abrindo um aplicativo de terminal (GNOME Terminal, etc.) no desktop
  • Iniciando um novo shell digitando bash

Arquivos carregados:

  1. /etc/bash.bashrc
  2. ~/.bashrc

Regra rápida: Terminal de desktop -> ~/.bashrc. Conexão SSH -> ~/.profile (ou ~/.bash_profile).

A Ordem Completa de Carregamento

Conclusão: Shells de login pulam ~/.bashrc a menos que ~/.profile ou ~/.bash_profile o chamem.

Lina: Meus aliases do .bashrc somem via SSH. É porque o shell de login nunca lê o .bashrc?
Veterano Linny: Exatamente. O SSH usa um shell de login. Então o .bashrc não é carregado automaticamente.
Shell de login (conexao SSH):
  /etc/profile
    └─ ~/.bash_profile (se existir)
         └─ ~/.bashrc (apenas se bash_profile o chamar explicitamente)
       ou
    └─ ~/.profile (se bash_profile nao existir)
         └─ ~/.bashrc (apenas se profile o chamar explicitamente)

Shell interativo (abertura de terminal):
  /etc/bash.bashrc
    └─ ~/.bashrc

Um shell de login não carrega o ~/.bashrc automaticamente.

Para usar seus aliases e funções via SSH, é preciso um passo a mais. Chame o ~/.bashrc você mesmo, de dentro do ~/.bash_profile ou do ~/.profile.

Problemas Comuns e Como Corrigi-los

Conclusão: Quando os aliases falham via SSH, chame o ~/.bashrc a partir do ~/.bash_profile. Depois de editar, execute source ~/.bashrc para aplicar agora.

Problema 1: Aliases Faltando Após Login SSH

Lina: Adicionei meus aliases no .bashrc. Mesmo assim, depois de conectar via SSH, recebo "command not found".
Lina: Será que escrevi errado? Já conferi o arquivo várias vezes.
Veterano Linny: A forma como você escreveu está certa. A causa é que um shell de login não lê o .bashrc.
Lina: Então o arquivo em si nunca foi lido? Isso não me passou pela cabeça.
Veterano Linny: Isso. Então vamos adicionar ao .bash_profile uma linha que carrega o .bashrc. Escreva uma vez e, daí em diante, acontece sozinho.
Lina: Era uma questão de lugar, não de escrita. Agora fez sentido.

Correção: Primeiro verifique se o ~/.bash_profile existe.

$ ls -a ~ | grep bash_profile
  • Nada aparece (o padrão do Ubuntu): adicione as linhas ao ~/.profile. Não crie um ~/.bash_profile novo. Criá-lo faz o ~/.profile deixar de ser lido, e o PATH que o Ubuntu configura para você se perde.
  • Um nome aparece: adicione as linhas nesse ~/.bash_profile.

As linhas a adicionar são estas três:

if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

Essas três linhas significam "se existir um arquivo chamado ~/.bashrc, leia-o". O if executa algo apenas sob uma condição. O -f verifica se o arquivo existe.

O Ubuntu frequentemente inclui este trecho no ~/.profile por padrão. Verifique primeiro:

cat ~/.profile
# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

Se você ver esta saída, suas sessões SSH já carregarão ~/.bashrc.

Problema 2: Editou .bashrc mas o Terminal Não Atualizou

Lina: Editei o .bashrc e salvei. O meu terminal aberto ainda não consegue usar o novo alias.
Veterano Linny: Abrir um terminal novo resolveria. O problema é que a alteração não chega a um terminal que já está aberto.
Veterano Linny: É para isso que serve o comando source.

Use o source e a alteração vale na hora.

source ~/.bashrc

A forma abreviada significa o mesmo:

. ~/.bashrc

O source (ou .) executa o arquivo dentro do shell atual, e não em um processo separado.

A alteração passa a valer na hora. Você não precisa abrir um terminal novo.

Como Verificar Seu Tipo de Shell Atual

Conclusão: Execute echo $0. Um traço no início indica um shell de login. Sem traço, não é um.

Lina: Como posso saber se o meu shell atual é um shell de login?
Veterano Linny: Olhe a variável $0. Ela guarda o nome do shell que você está usando.
echo $0
# Shell de login: comeca com traco (-)
-bash

# Shell nao-login: sem traco inicial
bash

Para ver quais arquivos de inicialização estão sendo lidos, use este comando:

$ bash --login -x -c 'exit' 2>&1 | head -30

O -c 'exit' manda o novo shell encerrar assim que inicia. Sem isso, o comando fica esperando entrada e parece travado.

Cada passo executado aparece prefixado com +. As linhas que começam com . -- como . /etc/profile ou . /home/user/.bashrc -- são os arquivos de configuração que foram lidos.

O Que Colocar Onde

Conclusão: Aliases e funções vão no ~/.bashrc. Variáveis de ambiente como o PATH vão no ~/.profile.

Lina: No fim das contas, qual arquivo devo usar para cada coisa?
Veterano Linny: Separar por finalidade deixa tudo mais simples.
Tipo de Configuração Onde Escrever Razão
Aliases (alias ll='ls -la') ~/.bashrc Necessários apenas em terminais interativos
Funções do shell ~/.bashrc Mesmo que acima
Variáveis de ambiente (PATH) ~/.profile Necessárias também em shells de login
Configurações de prompt (PS1) ~/.bashrc Configurações visuais pertencem ao terminal

Escrever o PATH no ~/.bashrc costuma funcionar no dia a dia.

Mas alguns programas rodam sem um shell de login, como os cron jobs. Lá, a configuração pode nunca valer. Colocar as variáveis de ambiente importantes no ~/.profile é a escolha mais segura.

Mini Exercícios: Experimente Você Mesmo

Conclusão: Tipo de shell, arquivo lido ou não, e recarga na hora. Três exercícios cobrem este artigo na prática.

Lina: Acho que entendi a teoria. Gostaria de experimentar sozinha.
Veterano Linny: Ótimo. Preparei três exercícios. Execute-os no seu terminal.

Exercício 1: Descubra se o shell que você está usando é um shell de login.

Ver Dica 1 (Direção)

Uma variável guarda o nome do shell que você está usando. Mostre o conteúdo dela na tela.

Ver Dica 2 (Nome do comando)

Use echo. A variável é $0.

Ver Resposta
$ echo $0
bash

Sem o - no início, não é um shell de login. Isso é o normal em um terminal de desktop. Via SSH, aparece -bash.

Exercício 2: Verifique se o ~/.profile tem uma linha que carrega o .bashrc.

Ver Dica 1 (Direção)

Um comando procura em um arquivo e mostra apenas as linhas que contêm uma palavra. Peça também os números das linhas.

Ver Dica 2 (Nome do comando)

Use grep. A opção para numerar as linhas é -n. A palavra procurada é bashrc.

Ver Resposta
$ grep -n "bashrc" ~/.profile
6:    if [ -f "$HOME/.bashrc" ]; then
7:        . "$HOME/.bashrc"
8:    fi

Linhas como essas indicam que o .bashrc também é lido no login via SSH. Se nada aparecer, adicione as três linhas do Problema 1.

Exercício 3: Adicione um alias de teste e deixe-o utilizável sem abrir um terminal novo.

Ver Dica 1 (Direção)

Adicione uma linha ao final do arquivo de configuração. Depois leia esse arquivo de novo no shell atual.

Ver Dica 2 (Nome do comando)

Adicione com echo e >>. Releia com source. O arquivo é o ~/.bashrc.

Ver Resposta
$ echo "alias hello='echo Hello Linux World!'" >> ~/.bashrc
$ source ~/.bashrc
$ hello
Hello Linux World!

O >> adiciona uma linha ao final do arquivo. Um > sozinho apagaria o arquivo inteiro, por isso ele não é usado aqui.

Para remover o alias de teste, apague a última linha do ~/.bashrc e execute source ~/.bashrc.

Dica: se ainda não funcionar

Verifique se o alias foi realmente adicionado:

tail -5 ~/.bashrc

Às vezes a linha está lá e mesmo assim falha. Nesse caso, um erro dentro do .bashrc pode ser a causa:

bash -n ~/.bashrc

Este comando apenas inspeciona a escrita; ele não executa o arquivo. Nenhuma saída significa que a escrita está correta.

Revisão

Lina: Então, quando uma configuração não faz efeito, eu devo perguntar se o arquivo foi lido antes de duvidar de como escrevi.
Veterano Linny: Exatamente. .bashrc quando você abre um terminal, .profile quando você faz login. Mantenha os dois separados na cabeça.
Lina: E para alcançar um terminal que já está aberto, uso o source. Anotado.
Veterano Linny: Isso mesmo. Na dúvida, execute echo $0 para ver em qual tipo de shell você está.

Resumo

Pontos-Chave para Lembrar

  • ~/.bashrc é carregado quando você abre um terminal (shell interativo)
  • ~/.profile é carregado no login SSH ou login do sistema (shell de login)
  • ~/.bash_profile tem prioridade sobre ~/.profile quando ambos existem
  • Para usar configurações do .bashrc via SSH, chame-o do ~/.profile ou ~/.bash_profile
  • Para aplicar edições imediatamente, execute source ~/.bashrc

Resumo do Dia em 3 Linhas

  1. O ~/.bashrc é lido ao abrir um terminal; o ~/.profile é lido ao fazer login
  2. Quando os aliases falham via SSH, chame o ~/.bashrc a partir do ~/.profile
  3. Para alcançar um terminal que já está aberto, execute source ~/.bashrc

Próximas Leituras