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.
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
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
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
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
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.
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
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
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
Outra inicialização pode facilmente ser adicionada ao
profile adicionando-se conjuntos
adicionais de comandos sequenciados ao diretório /etc/profile.d.
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.
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
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
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
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
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.