Não há nada embutido para adicionar aliases permanentes. Esses aliases são criados adicionando-os a um arquivo de configuração originado por shells interativos, como você fez com .bashrc
.
Mas você pode considerar modificar sua implementação palias()
, colocando os alias em um arquivo separado. Eu acho que isso pode ser considerado uma melhoria, por cinco razões:
-
O arquivo que é editado na maior parte automaticamente pode ser separado do arquivo que é editado principalmente manualmente. Se você precisa ver o que aconteceu - por curiosidade ou para investigar um problema - essa separação pode ser útil. (Ou se a função é acidentalmente chamada muitas vezes, criando um grande número de linhas desnecessárias, o dano será um pouco mais contido.)
-
Ao colocar as definições de alias individuais geradas automaticamente em lugar de
.bashrc
, você cria um sistema que "funciona nos bastidores", que geralmente é o que as pessoas querem quando procuram um servidor dedicado para executar uma tarefa. . -
.bashrc
geralmente é bastante complicado. Será mais fácil de ler e modificar para fins não relacionados se não for preenchido com muitos aliases adicionados automaticamente definidos pelo usuário. -
Implementações simples de
palias()
- incluindo o que você escreveu e o que estou prestes a recomendar - criarão linhas ruins se o arquivo ao qual elas estão anexando ainda não tiver terminado de nova linha (ou em branco). Normalmente, os editores de texto fazem isso por você, mas é possível terminar acidentalmente um arquivo de texto sem uma nova linha, caso em quepalias()
criará uma linha conjunta que pode ou não estar correta, e que de qualquer forma seria muito difícil ler. Ao colocar aliases em um arquivo separado que você raramente, ou pelo menos com menos frequência, edite manualmente, você diminui o risco disso. -
Se você expandir sua implementação de
palias()
para ler o conteúdo existente de seu arquivo de destino, por exemplo, para fornecer avisos úteis, pode ser muito mais fácil fazê-lo se for suposto consistir inteiramente em alias definições. (Ou, para uma análise mais sofisticada: inteiramente de definições de alias e linhas consideradas erradas). -
Já é amplamente sugerido (embora não seja como qualquer tipo de advertência) colocar novos aliases em um arquivo separado:
.bash_aliases
Veja Como faço para criar um alias de Bash permanente? para mais informações sobre locais onde colocar pseudônimos.
Arquivos padrão .bashrc
no Ubuntu contêm o código:
# 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
Assim, se você criar .bash_aliases
, ele será usado. O comando para definir a função palias()
pode ser:
palias() { echo "alias =''" >> ~/.bash_aliases; }
Esse comando ainda deve estar em .bashrc
, mas os aliases criados por ele serão colocados em .bash_aliases
.
Implementações mais sofisticadas são possíveis. Você poderia:
-
Execute a definição e adicione-a, por isso é imediatamente utilizável. Isso é sugerido na resposta dos osirisgothra . Eu usaria:
palias() { echo "alias =''" >> ~/.bash_aliases; alias "="; }
-
Verifique se
.bash_aliases
é inexistente, vazia ou com nova linha terminada e, se não estiver vazia, mas não for terminada com nova linha, anexe uma nova linha antes da definição do alias.palias() { local target=~/.bash_aliases [[ -f "$target" && -n $(tail -c1 "$target") ]] && echo >> "$target" echo "alias =''" >> "$target" }
Veja a resposta de Gilles para Adicione novas linhas faltantes em vários arquivos para obter detalhes sobre como detectar novas linhas com
tail
. -
Verifique e avise sobre a definição de um alias que já tenha sido definido em
.bash_aliases
.Ploutox sugeriu essa ideia. Mas eu não recomendo usar
grep ~/.bash_aliases
ou similar, porque ele produzirá falsos positivos frequentes, a qualquer momentocorresponderá a qualquer parte da definição de outro alias e ocasionais falsos negativos. A questão é ainda mais complicada pela forma como alguns aliases bash válidos, tomados como expressões regulares, combinam mais do que eles mesmos -
+
e.
realmente são usados em nomes de comandos e alias - e alguns não correspondem a si próprios.
grep "alias ="
é melhor, mas atenua o problema apenas parcialmente. Um^
líder no padrão corresponderia muito bem somente à% principal co_de% de uma definição, mas não resolveria o problema de metacaracteres regexp emalias name
, enquanto usarremoveria todos os metacaracteres de seu significado especial, mas em isso impedindo que
grep -F
seja usado.^
inggrep
desta forma é pior do que.bashrc
, já que há uma variedade essencialmente ilimitada de texto que pode ser parte desse arquivo, principalmente fora de quaisquer definições de alias.Se você quiser verificar os aliases definidos no shell atual, estejam ou não escritos em
.bash_aliases
(ou em qualquer lugar), você pode usar.bash_aliases
(ou executaralias ""
sem argumentos e combinar, cuidadosamente, contra a sua saída). O crédito vai para muru para esta idéia. tem a desvantagem de que, se você definir um alias comalias
para testá-lo e, em seguida, torná-lo permanente comalias
, receberá um aviso, embora ainda não seja permanente e esteja tudo bem.Para verificar novos alias permanentes em relação ao conteúdo de
palias
, você pode fazer algo assim:palias() { local target=~/.bash_aliases if grep -Pqs '^[ \t]*alias[ \t]+\Q'""'\E\=' "$target"; then printf "%s: %s: warning: defining \'%s' again in %s\n" \ "%pre%" "$FUNCNAME" "" "$target" >&2 fi echo "alias =''" >> "$target" }
Isso parece funcionar bem, embora eu suspeite que existam formas mais elegantes. (Indiscutivelmente,
.bash_aliases
deve ser removido, se você tirar espaço em branco antes de[ \t]*
como uma sugestão de que é parte de uma definição de alias de múltiplas linhas.) Ele não funcionará sealias
aparecer em\E
, mas metacaracteres do shell e a citação de caracteres comonão são válidos em nomes de alias , portanto, você não precisará dê isso como entrada.
Idealmente, em qualquer entrada errada, qualquer função do usuário chamada não executaria nenhuma operação, exceto imprimir uma mensagem de erro útil. Mas pela natureza de\
, pelo menos a menos que você esteja preparado para tornar sua definição muito mais sofisticada (veja abaixo), o ônus da entrada razoável já recai sobre o usuário. Você pode escrever erros de sintaxe de não-aliases e de alias empalias()
com essa função e, embora isso seja provavelmente aceitável, dada a maneira como você usará.bash_aliases
, asfixiarpalias()
é menor em comparação.Mais seriamente,
\E
é uma sintaxe perfeitamente boa para o comandoalias name1='def1' name2='def2' ...
, mas não tentei analisar as definições de alias dadas como argumentos subseqüentes paraalias
inalias
, pois acredito que determine corretamente onde o primeiro espaço em branco não cotado ocorre não é trivial.Portanto, se você usar a implementação
.bash_aliases
acima e também definir manualmente os aliases empalias()
(ou qualquer arquivo usado como.bash_aliases
), defina apenas um alias por$target
line, se desejar ter um comportamento de aviso confiável.
Ele também falhará ao reconhecer as definições de alias à direita de umalias ...
ou outros conectivos, por exemplo para encadear comandos;
separados na mesma linha, mas parece improvável você gostaria de fazer isso emalias
. -
Analise
.bash_aliases
para garantir que seja um nome válido para um alias. -
Analise
para tentar descobrir se é um corpo plausível para um alias e, se não for, avise, falhe ou (quando aplicável) cite-o corretamente. Por exemplo, o que acontece se um caractere
aparecer em
'
? -
Faça uma versão mais simples disso, apenas verificando e endereçando
em
'
.
Mas você provavelmente não quer se incomodar com nada disso . Você sabe como sua função funciona, suas limitações e como usá-la corretamente. Eu vejo quatro opções para você que são ao mesmo tempo razoavelmente boas e muito simples:
- Continue usando o que você tem agora.
- Use uma implementação como acima, colocando os aliases em
em vez de
.bash_aliases
. - Crie um terceiro arquivo para aliases adicionados automaticamente e crie esse arquivo separadamente (em
.bashrc
ou.bashrc
. - Não use nada da função
.bash_alises
e apenas adicione aliases manualmente editandopalias()
ou.bash_aliases
.