Isso é constrangedor, mas depois de muitos anos usando sistemas POSIX em tempo integral, ainda tenho dificuldade em descobrir se uma personalização de shell deve ser feita em .bashrc
, .profile
ou em outro lugar. Sem mencionar alguns dos arquivos de configuração específicos do sistema operacional, como .pam_environment
.
Sim, sei como analisar a documentação e saber quando cada arquivo está ou não carregado. O que estou querendo saber é se alguém elaborou diretrizes abrangentes sobre como decidir em qual arquivo colocar um determinado tipo de personalização.
Responder1
DR:
~/.bash_profile
deve ser super simples e apenas carregar.profile
e.bashrc
(nessa ordem)~/.profile
tem coisas NÃO especificamente relacionadas ao bash, como variáveis de ambiente (PATH
e amigos)~/.bashrc
tem tudo o que você deseja em uma linha de comando interativa. Prompt de comando,EDITOR
variável, aliases bash para meu uso
Algumas outras notas:
Qualquer coisa que deva estar disponível para aplicativos gráficos OU para sh (ou bash invocado como
sh
) DEVE estar em~/.profile
~/.bashrc
não deve produzir nadaQualquer coisa que deva estar disponível apenas para shells de login deve entrar
~/.profile
Certifique-se de que isso
~/.bash_login
não existe.
Responder2
Nos últimos anos, tive muito tempo a perder, entãoterpesquisei isso por um pouco mais do que apenas 10 minutos. Não tenho ideia se este é o melhor layout, é apenas aquele que funciona corretamente em praticamente todos os casos.
Os requisitos:
~/.profile
deve ser compatível com qualquer /bin/sh – isso inclui bash, dash, ksh, qualquer outra coisa que uma distro possa escolher usar.Variáveis de ambiente devem ser colocadas em um arquivo que seja lido tanto por logins de console (ou seja, um shell de 'login') quanto por logins gráficos (ou seja, gerenciadores de exibição como GDM, LightDM ou LXDM).
Não faz muito sentido terambos
~/.profile
e~/.bash_profile
. Se o último estiver faltando, o bash usará o primeiro com prazer, e quaisquer linhas específicas do bash podem ser protegidas com uma verificação para$BASH
ou$BASH_VERSION
.A separação entre
*profile
e*rc
é que o primeiro é usado para shells de 'login' e o último sempre que você abre uma janela de terminal. No entanto, o bash no modo 'login' não origina~/.bashrc
, portanto,~/.profile
precisa fazer isso manualmente.
Omais simplesconfiguração seria:
Tenha um
~/.profile
que defina todas as variáveis de ambiente (exceto as específicas do bash), talvez imprima uma ou duas linhas e, em seguida, as fontes~/.bashrc
se estiverem sendo executadas pelo bash, aderindo à sintaxe compatível com sh, caso contrário.exportar TZ="Europa/Paris" exportar EDITOR = "vim" se ["$BASH"]; então . ~/.bashrc fi tempo de atividade
Tenha um
~/.bashrc
que execute qualquer configuração específica do shell, protegido com uma verificação demodo interativopara evitar quebrar coisas comosftp
no Debian (onde o bash é compilado com a opção de carregar~/.bashrc
mesmo para shells não interativos):[[ $- == *i* ]] || retornar 0 PS1='\h \w \$ ' start() { sudo serviço "$1" start; }
No entanto, há também o problema de certos comandos não interativos (por exemplo, ssh <host> ls
) skip ~/.profile
, mas variáveis de ambiente seriam muito úteis para eles.
Certas distribuições (por exemplo, Debian) compilam seu bash com a opção de fonte
~/.bashrc
para esses logins não interativos. Nesse caso, achei útil mover todas as variáveis de ambiente (asexport ...
linhas) para um arquivo separado,~/.environ
e obtê-las deambos.profile
e.bashrc
, com guarda para evitar fazer duas vezes:se ! ["$PREFIXO"]; então # ou $EDITOR, ou $TZ, ou ... . ~/.environ # geralmente qualquer variável que o próprio .environ definiria fi
Infelizmente, para outras distribuições (por exemplo, Arch), não encontrei uma solução muito boa. Uma possibilidade é usar o módulo PAM pam_env (habilitado por padrão), colocando o seguinte em
~/.pam_environment
:BASH_ENV=./.ambiente # não é um erro de digitação; precisa ser um caminho, mas ~ não funcionará
Então, é claro, atualizando
~/.environ
paraunset BASH_ENV
.
Conclusão? As conchas são uma dor. Variáveis de ambiente são uma dor. Opções de tempo de compilação específicas da distribuição são umaimensodor na bunda.
Responder3
Veja issoexcelente postagem no blog de ShreevatsaR. Aqui está um trecho, mas vá para a postagem do blog, que inclui uma explicação para termos como "shell de login", um fluxograma e uma tabela semelhante para Zsh.
Para Bash, eles funcionam da seguinte maneira. Leia a coluna apropriada. Executa A, depois B, depois C, etc. B1, B2, B3 significa que executa apenas o primeiro dos arquivos encontrados.
Login interativo Não login interativo Roteiro /etc/profile
A /etc/bash.bashrc
A ~/.bashrc
B ~/.bash_profile
B1 ~/.bash_login
B2 ~/.profile
B3 BASH_ENV
A ~/.bash_logout
C
Responder4
Desisti de tentar descobrir isso e criei um script ( ~/.shell-setup
) que extraí de todos os outros.
Essa abordagem requer ~/.shell-setup
dois recursos:
- Execute apenas uma vez, mesmo quando obtido repetidamente (useIncluir guardas)
- Não gere nenhuma saída indesejada (detecte quando a saída está ok)
#1 é bastante padrão, embora talvez não seja muito usado em scripts de shell.
O número 2 é mais complicado. Aqui está o que eu uso no bash:
if [ "" == "$BASH_EXECUTION_STRING" -a "" == "$DESKTOP_SESSION" ]; then
echo "Hello user!" # ... etc
fi
Infelizmente não me lembro como descobri isso ou por quedetectando um shell interativonão foi suficiente.