Qual é a diferença entre .bashrc
e .bash_profile
e qual deles devo usar?
bash
bashrc
.bash-profile
cfischer
fonte
fonte
.profile
, ter um olhar para esta questão: superuser.com/questions/789448/...Respostas:
Tradicionalmente, quando você faz login em um sistema Unix, o sistema inicia um programa para você. Esse programa é um shell, ou seja, um programa projetado para iniciar outros programas. É um shell de linha de comando: você inicia outro programa digitando seu nome. O shell padrão, um shell Bourne, lê comandos a partir de
~/.profile
quando é chamado como o shell de logon.Bash é uma concha tipo Bourne. Ele lê comandos a partir de
~/.bash_profile
quando é chamado como o shell de logon e, se esse arquivo não existir¹, ele tenta ler~/.profile
.Você pode chamar um shell diretamente a qualquer momento, por exemplo, iniciando um emulador de terminal dentro de um ambiente da GUI. Se o shell não for um shell de logon, ele não será lido
~/.profile
. Quando você inicia o bash como um shell interativo (ou seja, para não executar um script), ele lê~/.bashrc
(exceto quando chamado como um shell de logon, então ele lê apenas~/.bash_profile
ou~/.profile
.Portanto:
~/.profile
é o local para colocar itens que se aplicam a toda a sessão, como programas que você deseja iniciar quando efetuar login (mas não programas gráficos, eles entram em um arquivo diferente) e definições de variáveis de ambiente.~/.bashrc
é o lugar para colocar coisas que se aplicam apenas ao bash, como alias e definições de função, opções de shell e configurações de prompt. (Você também pode colocar as teclas de atalho lá, mas para o bash elas normalmente entram~/.inputrc
.)~/.bash_profile
pode ser usado em vez de~/.profile
, mas é lido apenas pelo bash, não por qualquer outro shell. (Isso é principalmente uma preocupação se você deseja que seus arquivos de inicialização funcionem em várias máquinas e seu shell de logon não seja baseado em todas elas.) Esse é um local lógico para incluir~/.bashrc
se o shell for interativo. Eu recomendo o seguinte conteúdo em~/.bash_profile
:Nos escritórios modernos, há uma complicação adicional relacionada a
~/.profile
. Se você efetuar login em um ambiente gráfico (ou seja, se o programa em que você digitar sua senha estiver em execução no modo gráfico), não receberá automaticamente um shell de login que lê~/.profile
. Dependendo do programa de login gráfico, do gerenciador de janelas ou do ambiente de trabalho executado posteriormente e de como sua distribuição configurou esses programas, você~/.profile
pode ou não ser lido. Caso contrário, geralmente há outro local onde você pode definir variáveis de ambiente e programas a serem iniciados quando efetuar login, mas infelizmente não há local padrão.Observe que você pode ver aqui e ali recomendações para colocar definições de variáveis de ambiente
~/.bashrc
ou sempre iniciar shells de login nos terminais. Ambos são más idéias. O problema mais comum de qualquer uma dessas idéias é que suas variáveis de ambiente serão definidas apenas em programas iniciados pelo terminal, não em programas iniciados diretamente com um ícone ou menu ou atalho de teclado.¹ Para completar, por solicitação: se
.bash_profile
não existir, o bash também tenta.bash_login
antes de retornar ao.profile
. Sinta-se livre para esquecer que existe.fonte
~/.bash_profile
pode ser usada em vez de~/.profile
, mas você também precisa incluir~/.bashrc
se o shell é interativo. é enganoso, pois são questões ortogonais. Não importa se você usa~/.bash_profile
ou~/.profile
precisa incluir~/.bashrc
no que você usa, se deseja que as configurações de lá tenham efeito no shell de login.~/.bashrc
tem algo a ver com a escolha, em~/.bash_profile
vez de~/.profile
não ser verdade. Se alguém inclui que~/.bashrc
qualquer tipo de script seja originado no momento do login (aqui é~/.bash_profile
ou~/.profile
) é porque ele deseja que as configurações~/.bashrc
sejam aplicadas ao shell de login da mesma forma que estão sendo aplicadas ao shell que não é de login.Deste breve artigo
fonte
Antigamente, quando os pseudo-tty não eram pseudo-e, na verdade, bem, datilografavam, e os UNIX eram acessados por modems tão lentos que era possível ver cada letra sendo impressa na tela, a eficiência era primordial. Para ajudar um pouco a eficiência, você tinha o conceito de uma janela principal de login e quaisquer outras janelas que costumava trabalhar. Na janela principal, você gostaria de receber notificações sobre novos emails, possivelmente executando outros programas em segundo plano.
Para dar suporte a isso, os shells originaram um arquivo
.profile
especificamente em 'shells de login'. Isso faria o especial, uma vez que a configuração da sessão. O Bash estendeu um pouco isso para examinar o .bash_profile antes do .profile, dessa forma, você pode colocar apenas o bash nas coisas (para que elas não estraguem o shell Bourne, etc., que também olham para o .profile). Outros shells, sem logon, apenas forneceriam o arquivo rc, .bashrc (ou .kshrc, etc).Isso é um pouco de anacronismo agora. Você não entra no shell principal tanto quanto no gerenciador de janelas da GUI. Não há janela principal diferente de qualquer outra janela.
Minha sugestão - não se preocupe com essa diferença, ela se baseia em um estilo antigo de usar o unix. Elimine a diferença em seus arquivos. Todo o conteúdo de .bash_profile deve ser:
[ -f $HOME/.bashrc ] && . $HOME/.bashrc
E coloque tudo o que você realmente deseja configurar no .bashrc
Lembre-se de que o .bashrc é fornecido para todos os shells, interativos e não interativos. Você pode causar um curto-circuito na fonte de shells não interativos colocando esse código próximo à parte superior de .bashrc:
[[ $- != *i* ]] && return
fonte
.$HOME/.bashrc
o Rich mostrado acima, as configurações em.bashrc
estarão disponíveis nos shells de login e, portanto, no ambiente da área de trabalho. Por exemplo, no meu sistema Fedora,gnome-session
é iniciado como-$SHELL -c gnome-session
, e também.profile
é lido..bashrc
no.profile
normalmente não funciona, porque.profile
pode ser executado por/bin/sh
e não bash (por exemplo, no Ubuntu para um login gráfico por padrão), e que a Shell pode não ser interativa (por exemplo, para um login gráfico).[[ $- != *i* ]] && return
"); Eu gosto que alguns dos meus.bashrc
sejam executados mesmo para shells não interativos, especificamente para definir env vars, quando emitidosssh hostname {command}
, para que os comandos remotos sejam executados corretamente (mesmo que o shell não seja interativo). Porém, outras configurações posteriores.bashrc
devem ser ignoradas. Normalmente, procuro TERM = burro e / ou desabilitado e depois saio cedo.Dê uma olhada neste excelente post de ShreevatsaR . Aqui está um extrato, mas acesse a postagem do blog, que inclui uma explicação para termos como "shell de login", um fluxograma e uma tabela semelhante para o Zsh.
fonte
[ -z "$PS1" ] && return
:? A tabela na minha resposta está fornecendo a lista de scripts executados pelo Bash, independentemente do conteúdo dos scripts, se o próprio script tiver a linha[ -z "$PS1" ] && return
, é claro que isso entraria em vigor, mas acho que isso não significa que devo alterar o mesa.MELHOR COMENTÁRIO PARA O CABEÇOTE / ETC / PERFIL
Com base na grande resposta de Flimm acima, eu insered este novo comentário na cabeça do meu Debian / etc / profile, (pode ser necessário ajustá-lo para sua distro.) :
E esta nota na cabeça de cada um dos outros arquivos de instalação para se referir a ele:
Vale ressaltar que eu acho que é o / etc / profile do Debian por fontes padrão (inclui) /etc/bash.bashrc (é quando o /etc/bash.bashrc existe). Portanto, os scripts de login leem os arquivos / etc, enquanto o não-login lê apenas o bash.bashrc.
Também é importante notar que o /etc/bash.bashrc está configurado para não fazer nada quando não é executado de forma interativa. Portanto, esses dois arquivos são apenas para scripts interativos.
fonte
A lógica de configuração do próprio bash não é muito complicada e explicada em outras respostas nesta página, em falha do servidor e em muitos blogs. O problema, porém, é o que as distribuições Linux fazem do bash , refiro-me às formas complexas e variadas em que eles configuram o bash por padrão. http://mywiki.wooledge.org/DotFiles menciona brevemente algumas dessas peculiaridades. Aqui está um exemplo de rastreio no Fedora 29, que mostra quais arquivos originam quais outros arquivos e em que ordem para um cenário muito simples: conectando-se remotamente ao ssh e iniciando outro subshell:
A lógica mais complexa do Fedora está dentro
/etc/bashrc
. Como visto acima, o/etc/bashrc
arquivo bash não conhece, quero dizer, não diretamente. Os/etc/bashrc
testes do Fedora se:... e depois faz coisas completamente diferentes, dependendo delas.
Se você acha que consegue se lembrar do gráfico acima, é muito ruim porque não é o suficiente: este gráfico descreve apenas apenas um cenário, coisas ligeiramente diferentes acontecem ao executar scripts não interativos ou ao iniciar uma sessão gráfica. Eu omiti
~/.profile
. Omitibash_completion
scripts. Por motivos de compatibilidade com versões anteriores, invocar o bash como em/bin/sh
vez de/bin/bash
alterar seu comportamento. E o zsh e outras conchas? E é claro que diferentes distribuições Linux fazem as coisas de maneira diferente, por exemplo, o Debian e o Ubuntu vêm com uma versão não-padrão do bas h, com customizações específicas do Debian. Ele procura especialmente um arquivo incomum:/etc/bash.bashrc
. Mesmo se você se ater a uma única distribuição Linux, ela provavelmente evoluirá com o tempo. Espere: nós nem sequer tocamos no macOS, no FreeBSD, ... Finalmente, vamos pensar nos usuários presos às formas ainda mais criativas que seus administradores configuraram no sistema que precisam usar.Como o fluxo interminável de discussões sobre este tópico demonstra, é uma causa perdida. Contanto que você queira adicionar novos valores, algumas "tentativas e erros" tendem a ser suficientes. A verdadeira diversão começa quando você deseja modificar em um arquivo (usuário) algo já definido em outro (em / etc). Em seguida, esteja preparado para gastar algum tempo criando uma solução que nunca será portátil.
Para um pouco de diversão, aqui está o "gráfico de origem" do mesmo cenário simples no Clear Linux a partir de junho de 2019:
fonte