Global bash_profile

20

Sei que existem /etc/profilee /etc/bashrcarquivos para definir variáveis de ambiente global e talvez eu só estou mal-entendido seus propósitos, mas ...

Existe um bash_profilearquivo global ?

Estou usando o Mac OS X

Hubro
fonte

Respostas:

15

Não é chamado bash_profile, mas o local padrão para a configuração global do bash é /etc/bash.bashrc. É comum chamar isso de /etc/profilese o shell for bash. Por exemplo, no meu /etc/profileeu tenho:

if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1=’0
    if [ f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  fi
fi

Em termos de uso, /etc/profilefornece configuração em todo o sistema para todos os shells compatíveis com Bourne (sh, bash, ksh, etc.). Normalmente, não há necessidade de um equivalente /etc/bash_profile, porque a intenção do arquivo de perfil é controlar o comportamento dos shells de login. Normalmente, qualquer coisa que você queira fazer não será específica do bash. /etc/bash.bashrcé específico do bash e será executado para os shells de login e não-login.

Para complicar ainda mais as coisas, parece que o OS X nem sequer tem um /etc/bash.bashrc. Provavelmente, isso está relacionado ao fato de que os Terminais no OS X assumem o padrão de execução como shells de logon , de modo que a distinção se perde:

Uma exceção às diretrizes da janela de terminal é o Terminal.app do Mac OS X, que executa um shell de login por padrão para cada nova janela de terminal, chamando .bash_profile em vez de .bashrc. Outros emuladores de terminal da GUI podem fazer o mesmo, mas a maioria costuma não fazer.

Eu não executo o OS X, então a extensão do meu conhecimento termina aí.

ire_and_curses
fonte
Não leia a /etc/bash.bashrcpartir de um shell não interativo. /etc/profilepode ser lido por shell não interativo. Veja a diferença entre o Shell de login e o Shell que não é de login?
Gilles 'SO- stop be evil'
@ Gilles - Eu não estou claro que ponto você está tentando fazer aqui. Um shell de logon não interativo é algo realmente incomum. Para referência, o código que cito não é minha própria criação. É do padrão /etc/profileno Ubuntu 12.04. O que você sugeriria se alguém quisesse um /etc/profileque fosse executado apenas sob o bash e nenhum outro shell compatível com sh?
ire_and_curses
O sistema /etc/profilede arquivos para o meu sistema contém um comentário no topo que diz: # System-wide .profile for sh(1). Isso significa que profileé shespecífico? De shalguma forma corre antes bash?
Josh Voigts - shé um subconjunto de bash. /etc/profileé executado para sh, bashe todos os outros shells compatíveis com Bourne.
ire_and_curses
@ire_and_curses Parece que o arquivo é chamado /etc/bashrcno mac, não /etc/bash.bashrc. Também parece funcionar /bin/shtambém.
precisa
4

/etc/profileé o global bash_profile. Não há nenhum arquivo específico para o bash, o bash apenas lê o arquivo padrão lido por todos os shell no estilo Bourne. É aí que você pode definir variáveis ​​de ambiente para todo o sistema.

Consulte Existe um arquivo equivalente ".bashrc" lido por todos os shells? para uma visão geral genérica dos arquivos de inicialização comuns do bash.

Gilles 'SO- parar de ser mau'
fonte
0

Configurar shell interativo (Bash) globalmente

Como o carregamento não é carregado /etc/profile, nada /etc/profile.d/é carregado (ao contrário dos shells de login, veja o final).

O arquivo global para isso é / etc / bashrc ou /etc/bash.bashrc (dependendo do -DSYS_BASHRC=sinalizador definido no tempo de compilação):

# System-wide .bashrc file for interactive bash(1) shells.
if [ -z "$PS1" ]; then
   return
fi

PS1='\h:\W \u\$ '
# Make bash check its window size after a process completes
shopt -s checkwinsize

[ -r "/etc/bashrc_$TERM_PROGRAM" ] && . "/etc/bashrc_$TERM_PROGRAM"

Normalmente, é uma boa ideia deixar esse arquivo como está (o máximo possível) para evitar conflitos. A estratégia que eu uso é semelhante à que os shells de login (/ etc / profile) usam.

Minha estratégia é anexar um carregador ao arquivo acima:

# Add new directory analog to /etc/profile.d
mkdir /etc/bashrc.d

# Write the loader to /etc/bash.bashrc (it might be /etc/bashrc on as mentioned above)
cat >> /etc/bash.bashrc << 'EOF'
# I appended this: Load scripts from /etc/bashrc.d
if test -d /etc/bashrc.d; then
  for script in /etc/bashrc.d/*.sh; do
    test -r "$script" && . "$script"
  done
  unset item
fi
EOF

Agora eu posso adicionar facilmente n personalizações ao arquivo de shell interativo global (bash) colocando novos arquivos .sh no diretório /etc/bashrc.d.

Colorir globalmente o Grep

/etc/bashrc.d/grep.sh

alias grep='grep --color=auto'

Você pode fazer isso com este recurso:

printf "alias grep=\'grep --color=auto\'" > /etc/bashrc.d/grep.sh

Compare profile.d vs bashrc.d

Se, depois de ler isso, você não estiver convencido, faça isso para se convencer:

printf "alias grep=\'grep --color=auto\'" > /etc/profile.d/grep.sh

Abra um novo emulador de terminal e procure por alguma palavra comum em seu diretório de usuário como "the" usando grep

grep -r 'the'

Nada deve ser colorido. Faça o mesmo em um console virtual executando CTRLALTF1 (lembre-se de que seu servidor X provavelmente está sendo executado em CTRLALTF7 para que você possa voltar. Se você esquecer, basta reiniciar o gerenciador de desktop, por exemplo)

grep -r 'the' 

produzirá resultados coloridos conforme desejado.

Nada deve ser colorido. Faça o mesmo em um console virtual CTRLALTF1(lembre-se de que seu servidor X provavelmente está sendo executado CTRLALTF7para que você possa voltar. Se você esquecer, basta reiniciar o gerenciador de desktop, por exemplo).

grep -r 'the' 

produzirá resultados coloridos conforme desejado.

Um shell de logon é o que você obtém ao inicializar uma máquina ou alternar entre os consoles virtuais por CTRLALTF1meio do FNthconsole virtual.

Um Shell de Login é carregado /etc/profileenquanto carrega /etc/profile.d/*.sharquivos.

Jonathan Komar
fonte