Por que o uso de alias sobre comandos padrão não é recomendado?

19

Por exemplo, um alias comum que vi no arquivo ~/.bashrc (ou equivalentes) é

alias rm='rm -i'

No entanto, tenho visto pessoas recomendarem contra isso porque

  1. o alias pode não existir em outro sistema e, como você se tornou descuidado com rm , você exclui inadvertidamente algo importante. [1]
  2. usando esse alias, você realmente se treina para digitar y ou yes após cada comando rm , o que anula todo o propósito.

Existem outras razões para recomendar isso? Alguns programas podem simplesmente fazer chamadas para rm em vez de \rm , e o aliasing pode causar problemas para eles?

Eu uso rm simplesmente como um exemplo, mas também vi outros comandos como cp ou mv cobertos por aliases. Pessoalmente, eu estou lentamente me treinando para usar um alias como este no lugar de rm -i :

alias trash='mv -v -t $HOME/.Trash'
    
por Ricardo Altamirano 05.03.2013 / 15:39

6 respostas

8

Supondo que você esteja usando o bash, isso não deve causar problemas para os scripts, pois shells bash não interativos não obtêm ~/.bashrc ou ~/.bash_profile (o que é provável onde seus aliases são colocados ou é o primeiro passo para obter seus aliases em outro script). Pode, no entanto, causar problemas se você estiver pesquisando scripts:

$ alias echo='command echo foo'
$ cat > script << 'EOF'
> #!/bin/bash
> echo bar
> EOF
$ chmod a+x script
$ ./script
bar
$ . ./script
foo bar

Sua pergunta cobre a maior parte da preocupação geral com o aliasing sobre os comandos existentes, sendo o principal deles que ambientes desconhecidos que parecem à primeira vista serem os mesmos podem produzir resultados muito diferentes. Por exemplo, o aliasing rm to rm -i tem boas intenções, mas é ruim na prática pelas razões que você declara.

    
por 05.03.2013 / 15:56
7

"Are there other reasons to recommend against this?"

Claro:

(3) Porque um dia espero adicionar as fundações construídas pelo [-----------] e pessoas paranóicas que criticam outras pessoas por usar alias de comandos padrão, mesmo que o uso de comandos padrão seja, bem, padrão.

Falando sério, estas são apenas advertências. Se você confia em si mesmo para não cair em nenhum desses abismos de destruição, então apenas tome cuidado e siga em frente.

Pessoalmente, eu alias muito poucos comandos padrão; Eu uso ligeiras variações porque eu sou, apenas um pouco, paranóico e anal retentivo. Mas um bom uso que eu encontrei para isso é com relação aos sistemas em que eu frequentemente loga como root ou outro usuário, e há algumas coisas que eu não quero rodar acidentalmente / lazily como root:

alias irc="echo \"No you don't!\""

ou

alias irc="su irc_user"
    
por 05.03.2013 / 16:00
4

Como um exemplo extremo, deixe-me apenas usar um comando padrão para ilustrar por que o uso de comandos padrão pode ser prejudicial:

alias ls='rm'

Obviamente, isso é ruim porque causaria uma surpresa desagradável algum dia. Da mesma forma, a substituição de comandos padrão por aliases acabará levando a uma infeliz surpresa quando você menos espera.

Mas deixe-me apresentar um cenário comum que acontecerá com quase todos os administradores Unix à medida que avançam em sua carreira:

Algum dia, no futuro, você começará um novo trabalho e trabalhará em um novo sistema que foi criado por outros. Serão três horas da manhã de sábado e você não está pensando direito e está propenso a cometer erros. Seu ambiente padrão não estará disponível. Na verdade, você é raiz.

Considerando isso, você vai se lembrar que rm não é aliado para rm -i ? Você vai verificar seus aliases especiais toda vez que fizer login na caixa? Se você mudar o ambiente do root, seus colegas de trabalho ficarão felizes com sua mudança?

Estou honestamente em cima do muro sobre isso. Eu trabalhei em milhares de sistemas em minha carreira, e se eu modificasse o ambiente em todos esses sistemas, seria difícil ver o valor.

Aliasing rm to rm -i é muito comum e eu já vi isso evitar muitos problemas, mas também causou muitas surpresas e horas de trabalho extra para recuperar arquivos apagados acidentalmente.

Então, agora eu tento evitar o aliasing de comandos comuns do sistema. Em vez disso, uso aliases e funções para fazer coisas que o shell não pode fazer facilmente. O que eu costumo fazer agora é anexar uma letra extra ao alias, como:

# List long, with color or special characters, depending on OS
alias  ll='ls -l'
# Long, with metacharacters, show dotfiles, don't show . and ..
alias lll='ls -lA'
# Long, with metacharacters, show dotfiles, show . and ..
alias lla='ls -la'
# List just the dotfiles
alias  l.='ls -l -Ad .????*'

# Useful greps
#alias hgrep='history |grep ${*} |grep -v $$'
alias greph='history |grep ${*}'
alias grepp='ps -ef |grep ${*}'

### Highlight some text.
# From http://unix.stackexchange.com/questions/366/convince-grep-to-output-all-lines-not-just-those-with-matches/367#367
highlight () { grep --color -E "$1|$" $2 ; }

E talvez eu devesse realmente me livrar do meu apelido final, porque adaptar-se a novas práticas leva tempo:

# For safety!
alias rm='rm -i'
    
por 05.03.2013 / 20:04
4

Há mais perigos para isso.

Por exemplo, se você usar shell-command no Emacs, talvez ache que recebeu "seu" comando (ou alias , mas não precisa atingir um ls alias em um terminal que muitas vezes antes de esquecer tudo sobre a criação do alias, pensando nisso como qualquer outro comando ...) - na verdade (de volta ao Emacs), você recebe o comando (unaliased). O Emacs irá executá-lo sem problemas, então você pode até ficar cego para o que acabou de acontecer!

Quanto a computadores e / ou sistemas diferentes, se você acha que é muito entediante configurar arquivos .rc individuais para todos eles, é possível ter apenas um desses arquivos, mas com cláusulas if para personalizar.

Por exemplo, em vez de avaliar cada função quando você as escreve, apenas quando tiver problemas com alguma delas, adicione-as à "lista negra", por último:

if [[ 'uname' == "SunOS" ]]; then
  unset -f mic cpkeep mcp mcph cpindex cpconf # not for Solaris
fi
    
por 06.03.2013 / 01:53
3

Renomear comandos padrão por aliases (isto é, o rm=rm -i ) certamente pode levar a surpresas onde o alias não está disponível. Eu prefiro não usar isso, e (por várias experiências amargas e amargas ;-) eu me acostumei a ler cada comando duas vezes, e se é rm ou mv ou qualquer outra coisa potencialmente destrutiva três vezes. E tais aliases levam automaticamente ao "rm foo" ENTER "y" Ops !! de qualquer forma (e custam um pressionamento de tecla extra a cada vez).

Mas isso é só comigo. Se você não espera rodar em ambientes alienígenas (outras máquinas, outros usuários, ...) e você pode instalar seus alias favoritos onde quer que esteja, vá à loucura. O Unix é conhecido por dar aos usuários uma corda mais que suficiente para atirar em seus próprios pés.

    
por 05.03.2013 / 20:41
0

As outras respostas são boas, mas todas elas só mostram como isso afeta você.

Deixe-me transformar a resposta do @Stephan Laswieski na sua cabeça um pouco.

Supondo que você não é onisciente, talvez seja necessário que outra pessoa trabalhe em sua conta de usuário ou aconselhe você sobre como fazer algo.

Então, quando eles fazem algo ou lhe dizem para fazer isso, pode não funcionar como esperado.

Na melhor das hipóteses, você terá que perder tempo explicando a eles o que aconteceu (se você estiver lá e puder lembrar ou descobrir que o alias é o causador do problema).

Na pior das hipóteses, veja uma reviravolta no exemplo em uma das outras respostas: alias ls = 'rm -rf'.

    
por 09.03.2013 / 05:23