Aliases de Bash devem estar nos arquivos .bash_aliases
ou .bashrc
em diretórios home individuais. Se você precisar criar aliases de bash globais, eles podem ir em /etc/bash.bashrc
, mas geralmente é melhor adicioná-los aos arquivos .bash_aliases
ou .bashrc
em /etc/skel
para que eles sejam herdados por usuários recém-criados.
É praticamente sempre errado definir um alias em .profile
, .bash_profile
ou /etc/profile
.
Para entender por que, é preciso entender sob quais circunstâncias comandos de cada um desses arquivos são executados. Existem equívocos sobre isso, que eu abordei abaixo.
Mesmo que você queira definir aliases para vários usuários, deve estar familiarizado com o modo como eles são definidos para usuários individuais, para que você possa decidir qual o melhor método de fazer o que precisa.
Aliases para usuários individuais
Especialmente se você usa uma GUI, a maioria de seus shells interativos provavelmente são shells que não são de login. Mesmo que você nunca use uma GUI, você provavelmente ainda usa shells não-login com alguma frequência. Você vai querer que seus aliases trabalhem nesses shells.
Especialmente se você fizer login não graficamente em um console virtual ou via SSH , você provavelmente usa shell de login por algum tempo. Então você quer que seus aliases trabalhem em shells de login interativos também.
Quando um shell interativo de não-login é iniciado , ele origina .bashrc
no diretório pessoal do usuário. Por padrão no Ubuntu, cada usuário .bashrc
se origina .bash_aliases
, se existir.
- Para fonte um arquivo é fazer com que seu conteúdo seja executado no shell atual . As alterações no ambiente de shell feitas em um arquivo que é originado persistem mesmo depois que todos os comandos no arquivo foram executados.
A leitura dos comentários no padrão .bashrc
do Ubuntu revela que é oficialmente pretendido que os aliases entrem em .bashrc
ou .bash_aliases
. .bashrc
já contém algumas definições de alias (execute grep '^[[:blank:]]*alias' ~/.bashrc
para vê-las) e fornece conselhos explícitos sobre onde colocar novas definições:
# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
Mas e os shells interativos login ? Em vez de .bashrc
, a origem dos shells de login .profile
.
- ... A menos que
.bash_login
exista, ele será originado. - ... A menos que
.bash_profile
exista, então ele será originado.
No entanto, a boa notícia é que, por padrão, no Ubuntu, os comandos em .bashrc
serão também executados em shells de login interativos porque o padrão .profile
verifica se o o shell atual é bash (e se .bashrc
existir) e, se for, origens .bashrc
:
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
Sugiro que os usuários definam novos aliases de bash em .bash_aliases
em seus diretórios iniciais (criando-o se ele já não existir). Essa é uma maneira simples e limpa de tornar as definições de alias permanentes no nível por usuário.
Os aliases não devem ser definidos em .profile
porque eles permaneceriam indefinidos em shells que não são de login. Ao contrário de muito do ambiente de um shell bash, os aliases não são exportados para shells filho:
ek@Io:~$ alias hi='echo "Greetings, $USER!"'
ek@Io:~$ hi
Greetings, ek!
ek@Io:~$ bash
ek@Io:~$ hi
hi: command not found
Em particular, por padrão, a maioria dos ambientes de desktop faz com que .profile
seja originado no login gráfico, mas:
- Isso não é necessariamente feito por um shell bash, então as definições de alias podem nem ser processadas, e mais importante
- mesmo que as definições de alias sejam processadas, elas não são passadas para processos filhos . Particularmente, eles não são passados para shells criados abrindo uma janela do Terminal!
Os aliases não devem ser definidos em .bash_profile
(ou .bash_login
) pela mesma razão, mas também por outro motivo. Criando ingenuamente um desses arquivos e colocando apenas definições de alias, ele impede que qualquer código em .profile
seja executado!
Em situações em que .bash_profile
ou .bash_login
é realmente útil, normalmente uma fonte é .profile
em algum lugar, o que resolve esse problema. (Então, o único problema restante é que, como com .profile
, a definição de aliases em .bash_profile
ou .bash_login
não funciona corretamente.)
Alias para Novo Usuários individuais, automaticamente
Quando uma conta de usuário do tipo destinada a representar um ser humano real é criada, um novo diretório é normalmente criado para servir como seu diretório inicial. O conteúdo de /etc/skel
é então copiado para seu diretório pessoal. É assim que vários usuários começam com alguns arquivos de configuração semelhantes em seus diretórios iniciais. No Ubuntu, isso inclui .profile
, .bashrc
e alguns outros arquivos.
Para alterar quais aliases são definidos para novos usuários, basta colocá-los em /etc/skel/.bash_aliases
(você precisará criá-lo) ou /etc/skel/.bashrc
.
Se você editar um arquivo já existente em /etc/skel
, talvez queira fazer o backup primeiro, mas não deve colocar o backup em /etc/skel
ou ele também será copiado para os novos usuários. diretórios iniciais.
Esta é provavelmente a melhor maneira de adicionar novos aliases para vários usuários. Os usuários existentes podem simplesmente adicionar os aliases. Se você definir os alias em /etc/skel/.bash_aliases
, poderá simplesmente direcioná-los para esse arquivo, que eles podem optar por copiar em seus diretórios iniciais (ou adicionar em seu próprio arquivo .bash_aliases
personalizado).
É trivial para um usuário indefinir um alias. Além disso, os alias não são extremamente robustos ; eles trabalham apenas em circunstâncias particulares. Se você precisar criar um novo comando que funcione o tempo todo, para todos , você não deve implementar esse comando como um alias. E você não consegue forçar aliases em usuários que não os querem - eles podem simplesmente unalias
deles.
Aliases globais, para todos os usuários
Embora eu sugira que você evite essa abordagem, você pode definir aliases no arquivo global /etc/bash.bashrc
. Eles serão então definidos tanto para shells interativos não-login como para shells de login interativos. A razão é que antes qualquer um dos arquivos no diretório inicial do usuário é originado:
- Os shells de login (e apenas os shells de login e outros processos se comportando como shells de login) executam comandos de
/etc/profile
automaticamente. - Somente shells não-login executam comandos em
/etc/bash.bashrc
automaticamente, mas - O
/etc/profile
do padrão do Ubuntu verifica se o shell em execução é bash (e se existe/etc/bash.bashrc
) e, se for o caso, origina/etc/bash.bashrc
.
Isso é análogo a como o padrão por usuário .profile
origina o por usuário .bashrc
se o shell for bash (conforme detalhado acima).
Veja como é o código real para isso no padrão /etc/profile
:
if [ "$PS1" ]; then
if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
# The file bash.bashrc already sets the default PS1.
# PS1='\h:\w$ '
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
else
if [ "'id -u'" -eq 0 ]; then
PS1='# '
else
PS1='$ '
fi
fi
fi
Esse bloco também executa outras tarefas. Especificamente, o% outer if
verifica se o shell provavelmente é interativo (verificando se o texto do prompt não está vazio), então verifica se o shell atual é bash e se as origens são /etc/bash.bashrc
e se não algum trabalho que, para o bash, já está feito em /etc/bash.bashrc
.
Você deve não definir aliases globais em /etc/profile
pela mesma razão que os usuários não devem defini-los em seus .profile
s locais: se você fizer isso, eles serão definidos apenas para shells de login, e não para as cascas de seus filhos.
Por fim, observe que, diferentemente do padrão por usuário .bashrc
, o arquivo /etc/bash.bashrc
padrão não contém nada sobre aliases. É um pouco incomum fornecer aos usuários aliases em um arquivo em que eles não possam editá-los ou desativá-los. (Claro, eles ainda podem fazer isso, substituindo suas definições em seus próprios .bashrc
, .bash_aliases
, ou em outro local.)