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
- A diferença entre
.bashrce.profile, e quando cada arquivo é lido - A diferença entre um shell de loginO primeiro shell iniciado logo após o usuário fazer login. e um shellUm programa interativo que interpreta os comandos digitados e os executa. interativo
- Por que aliases somem via SSH, e como corrigir isso
- Como aplicar uma alteração na hora com
source, sem reiniciar o terminal - Em qual arquivo fica cada tipo de configuração: aliases, variáveis de ambiente, promptUm símbolo (como $ ou #) exibido quando o shell está esperando sua entrada.
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.
.bashrc. Ele continua sem funcionar mesmo depois de eu reabrir o terminal.Este artigo responde estas perguntas:
- Qual é a diferença entre
.bashrce.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.
.bashrce.profilesã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.
.bashrc e .profile têm nomes parecidos. Não consigo saber em qual devo escrever.| 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.
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:
- Conectando a um servidor via SSH (
ssh user@host) - Mudando para rootA conta de administrador especial que pode fazer qualquer coisa no sistema. com
sudo -i - Mudando de usuário com
su -
Arquivos carregados:
/etc/profile~/.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:
/etc/bash.bashrc~/.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
~/.bashrca menos que~/.profileou~/.bash_profileo chamem.
.bashrc somem via SSH. É porque o shell de login nunca lê o .bashrc?.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
.bashrc. Mesmo assim, depois de conectar via SSH, recebo "command not found"..bashrc..bash_profile uma linha que carrega o .bashrc. Escreva uma vez e, daí em diante, acontece sozinho.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_profilenovo. Criá-lo faz o~/.profiledeixar de ser lido, e oPATHque 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
fiEssas 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
.bashrc e salvei. O meu terminal aberto ainda não consegue usar o novo alias.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.
$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.
| 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.
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
.bashrc quando você abre um terminal, .profile quando você faz login. Mantenha os dois separados na cabeça.source. Anotado.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_profiletem prioridade sobre~/.profilequando ambos existem- Para usar configurações do
.bashrcvia SSH, chame-o do~/.profileou~/.bash_profile - Para aplicar edições imediatamente, execute
source ~/.bashrc
Resumo do Dia em 3 Linhas
- O
~/.bashrcé lido ao abrir um terminal; o~/.profileé lido ao fazer login - Quando os aliases falham via SSH, chame o
~/.bashrca partir do~/.profile - Para alcançar um terminal que já está aberto, execute
source ~/.bashrc