Vou primeiro falar sobre o que é o Debian e, na maioria das vezes, o Ubuntu também define o bash. E último toque em outros sistemas.
Na configuração dos arquivos de inicialização do shell, há muita opinião.
Eu também tenho minha opinião, mas tentarei mostrar exemplos existentes de configurações corretas.
Vou usar o debuan, pois é muito fácil encontrar exemplos de seus arquivos.
E o debian é muito usado, então as configurações foram bem testadas,
Qual é o objetivo de verificar se o PS1 está definido?
Apenas para descobrir se o shell é interativo.
O default /etc/profile
no debian e no ubuntu (de / usr / share / base-files / profile):
if [ "${PS1-}" ]; then
if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
O if é lido: se interativo (PS1 padrão definido) e é um bash shell (mas não atuando como um padrão sh
), então altere o PS1 para um novo (não o padrão).
O padrão /etc/bash.bashrc
no debian também contém:
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
O que é bem claro no que faz: se interativo não for fonte (o resto).
No entanto, em /etc/skel/.bashrc
é um exemplo da maneira correta de testar um shell interativo (usando $-
):
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
Isso deve mostrar claramente o porquê do PS1 e uma alternativa.
A ordem correta
A configuração que você está denunciando deve ser evitada.
O pedido (de configurações do sistema para configurações de usuário mais específicas (para o bash)) é /etc/profile
, /etc/bash.bashrc
, ~/.profile
e finalmente ~/.bashrc
. Isso coloca os efeitos mais amplos (e para mais shells) em /etc/profile
(que é de propriedade de root) seguido por /etc/bash.bashrc
(que também é de propriedade de root), mas afeta apenas o bash. Em seguida, vêm as configurações pessoais em $HOME
, a primeira é ~/.profile
para a maioria das shells e ~/.bashrc
(quase equivalente a ~/.bash_profile
), específico apenas para bash.
Portanto, é errado usar ~/.bashrc
em ~/.profile
, ele está transformando uma configuração de usuário específica para bash em um mais geral que é afetando mais shells . Exceto se feito desta forma :
# ~/.profile: executed by the command interpreter for login shells
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
Verifica se o bash está sendo executado e carrega apenas .bashrc
, se for o caso.
Esta é uma decisão do upstream vinda do Debian. A justificativa é explicada aqui .
Na verdade, o inverso, a terceirização de ~/.profile
in ~/.bash_profile
(ou ~/.bashrc
) está apenas reaplicando regras gerais que já deveriam ter sido carregadas em um caso de uso específico e, portanto, "não tão ruins" ( Eu não estou dizendo "bom"). E eu não estou dizendo bem porque isso pode fazer com que o fornecimento de arquivos faça um loop. Como quando um sub-diretório carrega um pai, isso é um loop de diretório.
E é nesse cruzamento que a verificação de shell interativo faz sentido. Somente quando um shell é interativo é ~/.bashrc
carregado, mas, por sua vez, pode estar carregando ~/.profile
(ou o contrário) e, nesse caso, a verificação de um shell interativo pode ser usada.