Os Arquivos de Iniciação do Shell Bash

O programa 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 teu diretório home, ele possivelmente substitua as configurações globais.

Um shell de login interativo é iniciado depois de um login exitoso, usando /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 programa de shell (por exemplo, [prompt]$/bin/bash) ou pelo comando /bin/su. Um shell de não login interativo também é iniciado com um programa 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 conjunto de comandos sequenciados de shell está executando. Ele é não interativo, pois está processando um conjunto de comandos sequenciados 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, você deveria executar os comandos como um(a) usuário(a) desprivilegiado(a).

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

/etc/profile

Aqui está um /etc/profile base. Esse arquivo começa configurando algumas funções auxiliares e alguns parâmetros básicos. Ele especifica alguns parâmetros de histórico do bash e, para propósitos de segurança, desabilita manter um arquivo permanente de histórico para o(a) usuário(a) root. Em seguida, ele chama conjuntos de comandos sequenciados pequenos e de propósito único no diretório /etc/profile.d para fornecer a maior parte da inicialização.

cat > /etc/profile << "EOF"
# Begin /etc/profile
# Written for Beyond Linux From Scratch
# by James Robertson <jameswrobertson@earthlink.net>
# modifications by Dagmar d'Surreal <rivyqntzne@pbzpnfg.arg>

# System wide environment variables and startup programs.

# System wide aliases and functions should go in /etc/bashrc.  Personal
# environment variables and startup programs should go into
# ~/.bash_profile.  Personal aliases and functions should go into
# ~/.bashrc.

# Functions to help us manage paths.  Second argument is the name of the
# path variable to be modified (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

# Set the initial path
export PATH=/usr/bin

# Attempt to provide backward compatibility with LFS earlier than 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

# Set up some environment variables.
export HISTSIZE=1000
export HISTIGNORE="&:[bf]g:exit"

# Set some defaults for graphical systems
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}

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

unset script

# End /etc/profile
EOF

O Diretório /etc/profile.d

Agora crie o diretório /etc/profile.d, onde os conjuntos individuais de comandos sequenciados de inicialização são colocados:

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

/etc/profile.d/extrapaths.sh

Este conjunto de comandos sequenciados 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

# Set some defaults before other applications add to these paths.
pathappend /usr/share/info INFOPATH
EOF
[Nota]

Nota

O programa man deduz automaticamente o caminho de pesquisa para páginas de manual examinando o conteúdo da variável PATH; veja-se manpath(5) para detalhes. Configurar a variável MANPATH possivelmente substitua a dedução automática, de forma que os(as) editores(as) do BLFS não recomendam configurá-la. Se você precisar configurá-la por qualquer motivo, é melhor iniciar o valor dela com dois pontos (:), por exemplo MANPATH=:/opt/somepkg/share/man:/opt/otherpkg/share/man, de forma que os caminhos listados na variável MANPATH sejam pospostos ao valor deduzido automaticamente em vez de substituí-lo.

/etc/profile.d/readline.sh

Este conjunto de comandos sequenciados configura o arquivo padrão de configuração inputrc. Se o(a) usuário(a) não tiver configurações individuais, ele usará o arquivo global.

cat > /etc/profile.d/readline.sh << "EOF"
# Set up the INPUTRC environment variable.
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"
# By default, the umask should be set.
if [ "$(id -gn)" = "$(id -un)" -a $EUID -gt 99 ] ; then
  umask 002
else
  umask 022
fi
EOF

/etc/profile.d/i18n.sh

Este conjunto de comandos sequenciados 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 Configurando a Localidade do Sistema.

cat > /etc/profile.d/i18n.sh << "EOF"
# Set up i18n variables
for i in $(locale); do
  unset ${i%=*}
done

if [[ "$TERM" = linux ]]; then
  export LANG=C.UTF-8
else
  source /etc/locale.conf

  for i in $(locale); do
    key=${i%=*}
    if [[ -v $key ]]; then
      export $key
    fi
  done
fi
EOF

Outros Valores da Inicialização

Outra inicialização pode facilmente ser adicionada ao profile adicionando-se conjuntos adicionais de comandos sequenciados 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"
# Begin /etc/bashrc
# Written for Beyond Linux From Scratch
# by James Robertson <jameswrobertson@earthlink.net>
# updated by Bruce Dubbs <bdubbs@linuxfromscratch.org>

# System wide aliases and functions.

# System wide environment variables and startup programs should go into
# /etc/profile.  Personal environment variables and startup programs
# should go into ~/.bash_profile.  Personal aliases and functions should
# go into ~/.bashrc

# Provides colored /bin/ls and /bin/grep commands.

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'

# Provides prompt for interactive shells, specifically shells started
# in the X environment. [Review the LFS archive thread titled
# PS1 Environment Variable for a great case study behind this script
# addendum.]

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

# GnuPG wants this or it'll fail with pinentry-curses under some
# circumstances (for example signing a Git commit)
# Note that tty -s will "succeed" in LFS chroot environment so we cannot
# use -s instead of redirecting to /dev/null.
$(tty &>/dev/null) && export GPG_TTY=$(tty)

# End /etc/bashrc
EOF

O conjunto de comandos sequenciados acima 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. A configuração também depende do terminal sendo usado, de modo que precisa ser configurado para cada shell interativo, em vez de somente para o shell de login.

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

~/.bash_profile

Aqui está um ~/.bash_profile de base. Se você quiser que cada usuário(a) novo(a) tenha esse arquivo automaticamente, 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"
# Begin ~/.bash_profile
# Written for Beyond Linux From Scratch
# by James Robertson <jameswrobertson@earthlink.net>
# updated by Bruce Dubbs <bdubbs@linuxfromscratch.org>

# Personal environment variables and startup programs.

# Personal aliases and functions should go in ~/.bashrc.  System wide
# environment variables and startup programs are in /etc/profile.
# System wide aliases and functions are in /etc/bashrc.

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

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

# Having . in the PATH is dangerous
#if [ $EUID -gt 99 ]; then
#  pathappend .
#fi

# End ~/.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"
# Begin ~/.profile
# Personal environment variables and startup programs.

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

# Set up user specific i18n variables
#export LANG=<ll>_<CC>.<charmap><@modifiers>

# End ~/.profile
EOF

~/.bashrc

Aqui está um ~/.bashrc de base.

cat > ~/.bashrc << "EOF"
# Begin ~/.bashrc
# Written for Beyond Linux From Scratch
# by James Robertson <jameswrobertson@earthlink.net>

# Personal aliases and functions.

# Personal environment variables and startup programs should go in
# ~/.bash_profile.  System wide environment variables and startup
# programs are in /etc/profile.  System wide aliases and functions are
# in /etc/bashrc.

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

# Set up user specific i18n variables
#export LANG=<ll>_<CC>.<charmap><@modifiers>

# End ~/.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"
# Begin ~/.bash_logout
# Written for Beyond Linux From Scratch
# by James Robertson <jameswrobertson@earthlink.net>

# Personal items to perform on logout.

# End ~/.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, 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 teu ambiente de shell. Você consegue lê-la online em https://caliban.org/bash/index.shtml.