Como tornar facilmente um comando de alias permanente? [duplicado]

5

Eu pesquiso em todos os lugares e quase todo mundo estava sugerindo para abrir o ~/.bashrc ou ~/.bash_aliases , em seguida, colocar o comando alias lá, criei um nome de função palias como alias permanentes e coloquei em ~/.bashrc :

function palias(){ echo "alias =''" >> /home/User/.bashrc;}

Então, agora, se eu quiser permanentemente alias algum comando eu apenas:

palias update "sudo apt-get update"

Gostaria de saber se existe um comando interno como essa função, ou algo assim para instalar a partir de repositórios?

    
por Arsinux 05.08.2014 / 06:48

2 respostas

2

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:

  1. 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.)

  2. 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. .

  3. .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.

  4. 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 que palias() 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.

  5. 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).

  6. 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:

  1. 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 "="; }
    
  2. 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 .

  3. 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 momento corresponderá 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 em alias name , enquanto usar removeria todos os metacaracteres de seu significado especial, mas em isso impedindo que grep -F seja usado.

    ^ ing grep 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 executar alias "" 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 com alias para testá-lo e, em seguida, torná-lo permanente com alias , 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á se alias aparecer em \E , mas metacaracteres do shell e a citação de caracteres como nã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 em palias() com essa função e, embora isso seja provavelmente aceitável, dada a maneira como você usará .bash_aliases , asfixiar palias() é menor em comparação.

    Mais seriamente, \E é uma sintaxe perfeitamente boa para o comando alias name1='def1' name2='def2' ... , mas não tentei analisar as definições de alias dadas como argumentos subseqüentes para alias in alias , 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 em palias() (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 um alias ... ou outros conectivos, por exemplo para encadear comandos ; separados na mesma linha, mas parece improvável você gostaria de fazer isso em alias .

  4. Analise .bash_aliases para garantir que seja um nome válido para um alias.

  5. 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 ' ?

  6. 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:

  1. Continue usando o que você tem agora.
  2. Use uma implementação como acima, colocando os aliases em em vez de .bash_aliases .
  3. Crie um terceiro arquivo para aliases adicionados automaticamente e crie esse arquivo separadamente (em .bashrc ou .bashrc .
  4. Não use nada da função .bash_alises e apenas adicione aliases manualmente editando palias() ou .bash_aliases .
por Eliah Kagan 06.10.2014 / 19:54
1

Sugiro (é claro que você não ) ponha um eval "$_" após o comando echo , de modo que o alias seja adicionado imediatamente e um grep -Pq "alias " && return no início , para ter certeza de que (1) você não tem nomes de apelidos duplicados, (2) os aliases serão definidos imediatamente, em vez de esperar que eles sejam revistos.

Se você quiser ser ainda mais criativo (é assim que eu faço), também permita que ele pegue um número do seu histórico, defina-o como um alias ou um grupo de números atribuídos em sequência a um alias, ou mais, etc.

Eu coloquei bastante trabalho no meu próprio .bashrc ao longo dos anos - eu o compartilho sob um projeto chamado gxbase, mas como é "minhas preferências", provavelmente não é o que "outras pessoas" quer. Definições de configuração são uma coisa pessoal muito . A maioria das pessoas espera que as coisas pareçam com /etc/skel/.bashrc , e coisas como a conclusão do bash param de funcionar se você definir muitas opções personalizadas :) Apenas por diversão, meu link é link . O arquivo está em extras/my.bashrc/* (veja PS no final, se estiver interessado).

Quanto à sua pergunta, há muitas pessoas por aí que postam suas chamadas 'configurações finais do .bashrc', mas, infelizmente, elas são apenas finais para elas , meu a resposta é: você será mais feliz se criar esse arquivo sozinho e acredite em mim, pelo amor de tudo que é sagrado; faça [offline] backups !!! :) Uma "cópia impressa" é uma boa maneira de planejar ainda mais se você quiser ser ainda mais criativo!

PS: O conteúdo do .bashrc-git é uma bifurcação do projeto gitsh, então a maior parte do crédito para aquele vai para aquele cara, e o perlconsole & amp; A integração aptsh também não é minha (inteiramente). Você terá que instalar o perlconsole modificado & amp; arquivos aptsh para obter isso totalmente integrado em diretórios virtuais.

    
por osirisgothra 05.10.2014 / 18:08