Os Arquivos de Iniciação do Shell Bash

O aplicativo de shell /bin/bash (doravante referenciado apenas como "o shell") usa uma coleção de arquivos de iniciação para auxiliar a criar um ambiente. Cada arquivo tem um uso específico e possivelmente afete diferentemente os ambientes de login e os interativos. Os arquivos no diretório /etc geralmente fornecem configurações globais. Se um arquivo equivalente existir no seu diretório home, [então] ele possivelmente substitua as configurações globais.

Um shell de login interativo é iniciado depois de um login exitoso, usando o /bin/login, pela leitura do arquivo /etc/passwd. Essa invocação do shell normalmente lê /etc/profile e o equivalente privado dele ~/.bash_profile (ou o ~/.profile, se chamado como /bin/sh) assim que iniciar.

Um shell de não login interativo normalmente é iniciado em linha de comando usando um aplicativo de shell (por exemplo, [prompt]$/bin/bash) ou pelo comando /bin/su. Um shell de não login interativo também é iniciado com um aplicativo de terminal, tal como o xterm ou o konsole, a partir de dentro de um ambiente gráfico. Esse tipo de invocação do shell normalmente copia o ambiente do(a) ancestral e, então, lê o arquivo ~/.bashrc do(a) usuário(a) para instruções adicionais de configuração de iniciação.

Um shell não interativo usualmente está presente quando um script de shell está executando. Ele é não interativo, pois está processando um script e não aguardando por entradas geradas de usuário(a) entre os comandos. Para essas invocações de shell, somente o ambiente herdado a partir do shell ancestral é usado.

O arquivo ~/.bash_logout não é usado para uma invocação do shell. Ele é lido e executado quando um(a) usuário(a) sai de um shell de login interativo.

Muitas distribuições usam o /etc/bashrc para a inicialização abrangente ao sistema dos shells de não login. Esse arquivo usualmente é chamado a partir do arquivo ~/.bashrc do(a) usuário(a) e não é construído diretamente no próprio bash. Essa convenção é seguida nesta seção.

Para mais informação, veja-se info bash -- Nós: Arquivos de Iniciação do Bash e Shells Interativos.

[Nota]

Nota

A maioria das instruções abaixo é usada para criar arquivos localizados na estrutura de diretório /etc, o que exige que você execute os comandos como o(a) usuário(a) root. Se você escolher criar os arquivos nos diretórios home dos(as) usuários(as) em vez disso, [então] você deveria executar os comandos como um(a) usuário(a) desprivilegiado(a).

Observações de Usuário(a): https://wiki.linuxfromscratch.org/blfs/wiki/bash-shell-startup-files

/etc/profile

Aqui está um /etc/profile de base. Esse arquivo inicia configurando algumas funções auxiliares e alguns parâmetros básicos. Ele especifica alguns parâmetros do histórico do bash e, para propósitos de segurança, desabilita a manutenção de um arquivo permanente do histórico para o(a) usuário(a) root. Também configura um prompt padrão do(a) usuário(a). Então chama scripts pequenos e de propósito único no diretório /etc/profile.d para fornecer a maior parte da inicialização.

Para mais informação acerca das sequências de escape que você pode usar para o seu prompt (isto é, a variável de ambiente PS1), veja-se info bash -- Nó: Imprimindo um Prompt.

cat > /etc/profile << "EOF"
# Inicia /etc/profile
# Escrito para o Beyond Linux From Scratch
# por James Robertson <jameswrobertson@earthlink.net>
# modificações por Dagmar d'Surreal <rivyqntzne@pbzpnfg.arg>

# Aplicativos da inicialização e variáveis de ambiente abrangentes ao sistema.

# Alias e funções abrangentes ao sistema deveriam estar em /etc/bashrc.  Os aplicativos 
# da inicialização e as variáveis de ambiente pessoais deveriam estar no 
# ~/.bash_profile.  Alias e funções pessoais deveriam estar no 
# ~/.bashrc.

# Funções para nos auxiliar a gerenciar "paths". O segundo argumento é o nome da
# variável "path" a ser modificada (default: PATH)
pathremove () {
        local IFS=':'
        local NEWPATH
        local DIR
        local PATHVARIABLE=${2:-PATH}
        for DIR in ${!PATHVARIABLE} ; do
                if [ "$DIR" != "$1" ] ; then
                  NEWPATH=${NEWPATH:+$NEWPATH:}$DIR
                fi
        done
        export $PATHVARIABLE="$NEWPATH"
}

pathprepend () {
        pathremove $1 $2
        local PATHVARIABLE=${2:-PATH}
        export $PATHVARIABLE="$1${!PATHVARIABLE:+:${!PATHVARIABLE}}"
}

pathappend () {
        pathremove $1 $2
        local PATHVARIABLE=${2:-PATH}
        export $PATHVARIABLE="${!PATHVARIABLE:+${!PATHVARIABLE}:}$1"
}

export -f pathremove pathprepend pathappend

# Configura o caminho inicial
export PATH=/usr/bin

# Tenta fornecer retrocompatibilidade com o LFS anterior a 11
if [ ! -L /bin ]; then
        pathappend /bin
fi

if [ $EUID -eq 0 ] ; then
        pathappend /usr/sbin
        if [ ! -L /sbin ]; then
                pathappend /sbin
        fi
        unset HISTFILE
fi

# Configura algumas variáveis de ambiente.
export HISTSIZE=1000
export HISTIGNORE="&:[bf]g:exit"

# Configura alguns padrões para os sistemas gráficos
export XDG_DATA_DIRS=${XDG_DATA_DIRS:-/usr/share/}
export XDG_CONFIG_DIRS=${XDG_CONFIG_DIRS:-/etc/xdg/}
export XDG_RUNTIME_DIR=${XDG_RUNTIME_DIR:-/tmp/xdg-$USER}

# Configura um prompt vermelho para o(a) root e um verde para os(as) usuários(as).
NORMAL="\[\e[0m\]"
RED="\[\e[1;31m\]"
GREEN="\[\e[1;32m\]"
if [[ $EUID == 0 ]] ; then
  PS1="$RED\u [ $NORMAL\w$RED ]# $NORMAL"
else
  PS1="$GREEN\u [ $NORMAL\w$GREEN ]\$ $NORMAL"
fi

for script in /etc/profile.d/*.sh ; do
        if [ -r $script ] ; then
                . $script
        fi
done

unset script RED GREEN NORMAL

# Termina /etc/profile
EOF

O Diretório /etc/profile.d

Agora crie o diretório /etc/profile.d, onde os scripts individuais da inicialização são colocados:

install --directory --mode=0755 --owner=root --group=root /etc/profile.d

/etc/profile.d/bash_completion.sh

[Nota]

Nota

Usar o script de completação do bash abaixo é controverso. Nem todos(as) os(as) usuários(as) gostam dele. Ele adiciona muitas (usualmente mais que mil (1.000)) linhas ao ambiente do bash e torna difícil usar o comando 'set' para examinar variáveis simples de ambiente. Omitir-se este script não interfere na habilidade do bash de usar a tecla tab para a completação de nome de arquivo.

Este script importa scripts de completação do bash, instalados por muitos outros pacotes do BLFS, para permitir a completação de linha de comando TAB.

cat > /etc/profile.d/bash_completion.sh << "EOF"
# Início /etc/profile.d/bash_completion.sh
# Importa scripts de completação do bash

# Se o pacote "bash-completion" estiver instalado, use configuração dele ao invés
if [ -f /usr/share/bash-completion/bash_completion ]; then

  # Verificar Bash interativo e que já não fomos carregados.
  if [ -n "${BASH_VERSION-}" -a -n "${PS1-}" -a -z "${BASH_COMPLETION_VERSINFO-}" ]; then

    # Verificar versão do Bash suficientemente recente.
    if [ ${BASH_VERSINFO[0]} -gt 4 ] || \
       [ ${BASH_VERSINFO[0]} -eq 4 -a ${BASH_VERSINFO[1]} -ge 1 ]; then
       [ -r "${XDG_CONFIG_HOME:-$HOME/.config}/bash_completion" ] && \
            . "${XDG_CONFIG_HOME:-$HOME/.config}/bash_completion"
       if shopt -q progcomp && [ -r /usr/share/bash-completion/bash_completion ]; then
          # Carregar código de completação.
          . /usr/share/bash-completion/bash_completion
       fi
    fi
  fi

else

  # bash-completions não estão instaladas; use somente o diretório de completação do Bash
  if shopt -q progcomp; then
    for script in /etc/bash_completion.d/* ; do
      if [ -r $script ] ; then
        . $script
      fi
    done
  fi
fi

# Fim /etc/profile.d/bash_completion.sh
EOF

Tenha certeza de que o diretório existe:

install --directory --mode=0755 --owner=root --group=root /etc/bash_completion.d

Para uma instalação mais completa, veja-se https://wiki.linuxfromscratch.org/blfs/wiki/bash-shell-startup-files#bash-completions.

/etc/profile.d/dircolors.sh

Este script usa os arquivos ~/.dircolors e /etc/dircolors para controlar as cores dos nomes de arquivos em uma listagem de diretório. Eles controlam a saída gerada colorida de coisas como ls --color. A explicação do como inicializar esses arquivos está ao final desta seção.

cat > /etc/profile.d/dircolors.sh << "EOF"
# Configuração para /bin/ls e /bin/grep suportarem cor; o alias está em /etc/bashrc.
if [ -f "/etc/dircolors" ] ; then
        eval $(dircolors -b /etc/dircolors)
fi

if [ -f "$HOME/.dircolors" ] ; then
        eval $(dircolors -b $HOME/.dircolors)
fi

alias ls='ls --color=auto'
alias grep='grep --color=auto'
EOF

/etc/profile.d/extrapaths.sh

Este script adiciona alguns caminhos úteis à PATH e pode ser usado para personalizar outras variáveis de ambiente relacionadas a PATH (por exemplo, LD_LIBRARY_PATH, etc) que possivelmente sejam necessárias para todos(as) os(as) usuários(as).

cat > /etc/profile.d/extrapaths.sh << "EOF"
if [ -d /usr/local/lib/pkgconfig ] ; then
        pathappend /usr/local/lib/pkgconfig PKG_CONFIG_PATH
fi
if [ -d /usr/local/bin ]; then
        pathprepend /usr/local/bin
fi
if [ -d /usr/local/sbin -a $EUID -eq 0 ]; then
        pathprepend /usr/local/sbin
fi

if [ -d /usr/local/share ]; then
        pathprepend /usr/local/share XDG_DATA_DIRS
fi

# Configura alguns parâmetros residuais antes de outros aplicativos adicionarem a estes caminhos.
pathappend /usr/share/man  MANPATH
pathappend /usr/share/info INFOPATH
EOF

/etc/profile.d/readline.sh

Este script configura o arquivo padrão de configuração inputrc. Se o(a) usuário(a) não tiver configurações individuais, [então] usa o arquivo global.

cat > /etc/profile.d/readline.sh << "EOF"
# Configura a variável de ambiente "INPUTRC".
if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ] ; then
        INPUTRC=/etc/inputrc
fi
export INPUTRC
EOF

/etc/profile.d/umask.sh

Configurar-se o valor do umask é importante para a segurança. Aqui as permissões padrão de escrita do grupo são desligadas para os(as) usuários(as) de sistema e quando o nome do(a) usuário(a) e o nome do grupo não forem os mesmos.

cat > /etc/profile.d/umask.sh << "EOF"
# Por padrão, a máscara de usuário(a) deveria ser configurada.
if [ "$(id -gn)" = "$(id -un)" -a $EUID -gt 99 ] ; then
  umask 002
else
  umask 022
fi
EOF

/etc/profile.d/i18n.sh

Este script configura uma variável de ambiente necessária para o suporte ao idioma nativo. Uma discussão completa acerca de se determinar esta variável pode ser encontrada na página Arquivos de Inicialização do Shell Bash do LFS.

cat > /etc/profile.d/i18n.sh << "EOF"
# Configura variáveis de internacionalização.
export LANG=<ll>_<CC>.<charmap><@modifiers>
EOF

Outros Valores da Inicialização

Outra inicialização pode facilmente ser adicionada ao profile adicionando-se scripts adicionais ao diretório /etc/profile.d.

/etc/bashrc

Aqui está um /etc/bashrc de base. Os comentários no arquivo deveriam explicar tudo o que você precisa.

cat > /etc/bashrc << "EOF"
# Início /etc/bashrc
# Escrito para o Beyond Linux From Scratch
# por James Robertson <jameswrobertson@earthlink.net>
# atualização por Bruce Dubbs <bdubbs@linuxfromscratch.org>

# Alias e funções abrangentes ao sistema.

# Variáveis de ambiente e aplicativos de inicialização abrangentes ao sistema
# deveriam ir para /etc/profile. Variáveis de ambiente e aplicativos de inicialização pesoais
# deveriam ir para ~/.bash_profile. Alias e funções pessoais deveriam
# ir para ~/.bashrc

# Fornece comandos coloridos /bin/ls e /bin/grep. Usado junto
# com o código em /etc/profile.

alias ls='ls --color=auto'
alias grep='grep --color=auto'

# Fornece prompt para shells que não são de login, especificamente shells iniciados
# no ambiente do X. [Reveja-se o tópico do arquivamento do LFS intitulado
# "PS1 Environment Variable" para um grande estudo de caso por traz deste
# adendo de script].

NORMAL="\[\e[0m\]"
RED="\[\e[1;31m\]"
GREEN="\[\e[1;32m\]"
if [[ $EUID == 0 ]] ; then
  PS1="$RED\u [ $NORMAL\w$RED ]# $NORMAL"
else
  PS1="$GREEN\u [ $NORMAL\w$GREEN ]\$ $NORMAL"
fi

unset RED GREEN NORMAL

# Fim /etc/bashrc
EOF

~/.bash_profile

Aqui está um ~/.bash_profile de base. Se você quiser que cada usuário(a) novo(a) tenha esse arquivo automaticamente, [então] apenas mude a saída gerada do comando para o /etc/skel/.bash_profile e verifique as permissões depois que o comando for executado. Você pode, então, copiar o /etc/skel/.bash_profile para os diretórios home dos(as) usuários(as) já existentes, incluindo o(a) root, e configurar o(a) proprietário(a) e o grupo apropriadamente.

cat > ~/.bash_profile << "EOF"
# Início ~/.bash_profile
# Escrito para o Beyond Linux From Scratch
# por James Robertson <jameswrobertson@earthlink.net>
# atualizado por Bruce Dubbs <bdubbs@linuxfromscratch.org>

# Variáveis de ambiente e aplicativos de inicialização pessoais.

# Alias e funções pessoais deveriam ir em ~/.bashrc. Variáveis de
# ambiente e aplicativos de inicialização abrangentes ao sistema estão
# em /etc/profile. Alias e funções abrangentes ao sistema estão em /etc/bashrc.

if [ -f "$HOME/.bashrc" ] ; then
  source $HOME/.bashrc
fi

if [ -d "$HOME/bin" ] ; then
  pathprepend $HOME/bin
fi

# Ter-se o "." no PATH é perigoso.
#if [ $EUID -gt 99 ]; then
#  pathappend .
#fi

# Fim ~/.bash_profile
EOF

~/.profile

Aqui está um ~/.profile de base. Os comentários e as instruções para se usar o /etc/skel para o .bash_profile acima também se aplicam aqui. Somente os nomes dos arquivos alvo são diferentes.

cat > ~/.profile << "EOF"
# Início ~/.profile
# Variáveis de ambiente e aplicativos de inicialização pessoais.

if [ -d "$HOME/bin" ] ; then
  pathprepend $HOME/bin
fi

# Configura variáveis de internacionalização específicas de usuário(a).
#export LANG=<ll>_<CC>.<charmap><@modifiers>

# Fim ~/.profile
EOF

~/.bashrc

Aqui está um ~/.bashrc de base.

cat > ~/.bashrc << "EOF"
# Início ~/.bashrc
# Escrito para o Beyond Linux From Scratch
# por James Robertson <jameswrobertson@earthlink.net>

# Alias e funções pessoais.

# Variáveis de ambiente e aplicativos da inicialização pessoais deveriam
# ir em ~/.bash_profile. Variáveis de ambiente e aplicativos da
# inicialização abrangentes ao sistema estão em /etc/profile. Alias e
# funções abrangentes ao sistema estão em /etc/bashrc.

if [ -f "/etc/bashrc" ] ; then
  source /etc/bashrc
fi

# Configura variáveis de internacionalização específicas de usuário(a).
#export LANG=<ll>_<CC>.<charmap><@modifiers>

# Fim ~/.bashrc
EOF

~/.bash_logout

Este é um ~/.bash_logout vazio que pode ser usado como um modelo. Você perceberá que o ~/.bash_logout de base não inclui um comando clear. Isso é porque o clear é manuseado no arquivo /etc/issue.

cat > ~/.bash_logout << "EOF"
# Início ~/.bash_logout
# Escrito para o Beyond Linux From Scratch
# por James Robertson <jameswrobertson@earthlink.net>

# Itens pessoais a realizar quando do logout.

# Fim ~/.bash_logout
EOF

/etc/dircolors

Se você quiser usar o recurso dircolors, então execute o seguinte comando. As etapas de configuração do /etc/skel mostradas acima também podem ser usadas aqui para fornecer um arquivo ~/.dircolors quando um(a) usuário(a) novo(a) for configurado(a). Como antes, apenas mude o nome de arquivo da saída gerada no seguinte comando e se assegure de que as permissões, proprietário(a) e grupo estejam corretas nos arquivos criados e (ou) copiados.

dircolors -p > /etc/dircolors

Se desejar personalizar as cores usadas para os diferentes tipos de arquivo, [então] você pode editar o arquivo /etc/dircolors. As instruções para configurar as cores estão embutidas no arquivo.

Finalmente, Ian Macdonald escreveu uma excelente coleção de dicas e de truques para melhorar o seu ambiente de "shell". Você consegue lê-la online em https://www.caliban.org/bash/index.shtml.