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.
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 Editor(a): https://wiki.linuxfromscratch.org/blfs/wiki/bash-shell-startup-files
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
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
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.
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
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
# 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
pode substituir 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 anexados
ao valor deduzido automaticamente em vez de substituí-lo.
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
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
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 Configurando o Local do Sistema.
cat > /etc/profile.d/i18n.sh << "EOF"
# Configura variáveis de i18n
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 scripts
adicionais 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"
# 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
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
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
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
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
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.