Por que o aliasing sobre comandos padrão não é recomendado?

19

Por exemplo, um alias comum que eu vi no ~/.bashrcarquivo (ou equivalente) é

alias rm='rm -i'

No entanto, já vi pessoas recomendarem isso porque

  1. o alias pode não existir em outro sistema e, como você se tornou descuidado rm, exclui inadvertidamente algo importante. [1]
  2. usando esse alias, você efetivamente se treina para digitar you yesapós cada rmcomando, o que derrota todo o propósito.

Existem outros motivos para recomendar contra isso? Alguns programas podem simplesmente fazer chamadas em rmvez de \rm, e o aliasing sobre ele pode causar problemas para eles?

Uso rmsimplesmente como exemplo, mas já vi outros comandos como cpou mvcobertos por aliases também. Pessoalmente, estou me treinando lentamente para usar um alias como este no lugar de rm -i:

alias trash=`mv -v -t $HOME/.Trash`
Ricardo Altamirano
fonte
3
Toda vez que tropeço em um sistema com um alias padrão rm -i, ele me treina um pouco mais para adicionar automaticamente a -fsinalização.
Jander
Você pode alias rm -ipara o que quiser. Tais como del, irmetc. Você não precisa usar o alias rm. Isso contorna o ponto 1 e, usando seletivamente delou rmdependendo do que você deseja, você também evita o ponto 2 até certo ponto.
Martin Tournoij 6/03/2013

Respostas:

8

Supondo que você esteja usando o bash, isso não deve causar problemas para scripts, pois os shells do bash não interativos não são originários ~/.bashrcou ~/.bash_profile(o que provavelmente é onde seus aliases são colocados ou é o primeiro passo para obter seus aliases em outro script) . No entanto, pode causar problemas se você estiver fornecendo 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 sobre o aliasing dos comandos existentes, sendo a principal delas que ambientes desconhecidos que parecem à primeira vista iguais podem potencialmente produzir resultados bastante diferentes. Por exemplo, aliasing rmpara rm -item boas intenções, mas é ruim na prática pelas razões que você estado.

Chris Down
fonte
7

"Existem outras razões para recomendar contra isso?"

Claro:

(3) Porque um dia espero acrescentar aos fundamentos construídos pelas pessoas [-----------] e paranóicas que castigam outras pessoas por apelidar comandos padrão, mesmo que os apelidos comandos padrão sejam, bem, padrão .

Sério, porém, essas são apenas advertências. Se você confia em si mesmo para não cair em nenhum desses poços de destruição, basta tomar cuidado e seguir em frente.

Pessoalmente, eu tenho muito poucos comandos padrão; Uso pequenas variações porque sou um pouco paranóica e retentiva anal. Mas um bom uso que encontrei para isso é em relação aos sistemas nos quais costumo fazer login como root ou outro usuário, e há algumas coisas que não quero que sejam executadas acidentalmente / preguiçosamente como root:

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

ou

alias irc="su irc_user"
Cachinhos Dourados
fonte
4

Como um exemplo extremo, deixe-me usar o alias de um comando padrão para ilustrar por que os comandos padrão de aliasing podem ser prejudiciais:

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á por causar uma surpresa infeliz quando você menos espera.

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

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

Diante disso, você vai se lembrar de que rmnão tem alias rm -i? Você procurará seus aliases especiais sempre que fizer login na caixa? Se você mudar o ambiente da raiz, seus colegas de trabalho ficarão felizes com a mudança?

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

Fazer alias rmpara rm -ié muito comum e já vi muitos problemas, mas também causou muitas surpresas e horas de trabalho extra para recuperar arquivos excluídos acidentalmente.

Então agora eu tento evitar aliasing 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 costumo fazer agora é anexar uma carta 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 deva me livrar do meu pseudônimo final, porque a adaptação a novas práticas leva tempo:

# For safety!
alias rm='rm -i'
Stefan Lasiewski
fonte
8
Lembrar as bandeiras de lspode ser mais conveniente do que lembrar dez aliases.
Bernhard
Muito verdadeiro. E, de fato, raramente uso mais esses pseudônimos. Não sei por que ainda os tenho, senão os apelidos mais complicados (e funções) eram difíceis de descobrir e são bons para referência. Por simplicidade, eu provavelmente deveria removê-los.
precisa saber é o seguinte
A "ilustração" (primeiro exemplo) não é realmente útil. Isso é claramente malicioso, e sabemos que a armadilha de um sistema pode ser prejudicial. Seu exemplo rm-> rm -ié muito melhor. Outro bom seria aquele que aliases rm para colocar as coisas em um~/.trash
derobert
1
@ Bernhard: Verdade, mas os apelidos são mais rápidos de digitar. (Mas dez são muitos independentemente.)
Emanuel Berg
2
@StefanLasiewski: Dica: nunca remova coisas que não aparecem, por razões puramente estéticas. Deixe-os permanecer, a menos que o perturbem ativamente. É um ato tão rápido remover coisas depois de passar horas configurando-as; e se você se arrepende, se sente um idiota por não apenas deixá-los.
Emanuel Berg
4

Existem mais perigos para isso.

Por exemplo, se você usa o shell-commandEmacs, pode achar que obtém o comando "your" (ou alias , mas não precisa encontrar um lsalias em um terminal tantas vezes antes de esquecer tudo sobre a configuração do alias, pensando em como qualquer outro comando ...) - na verdade (de volta ao Emacs), você obtém o comando (sem alias). 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 muito tedioso configurar .rcarquivos individuais para todos eles, você pode apenas ter um desses arquivos, mas com ifcláusulas a serem personalizadas.

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
Emanuel Berg
fonte
3

Renomear comandos padrão por aliases (isto é, as rm=rm -icoisas) certamente pode levar a surpresas onde o alias não está disponível. Eu prefiro não usar tal, e (por várias experiências amargas, amargas ;-) eu me tornei acustomed lendo cada comando duas vezes, e se é rmou mvou qualquer outra coisa três vezes potencialmente destrutiva. E esses apelidos levam a "rm foo" automático "ENTER" e " Opa !! de qualquer maneira (e custa um pressionamento de tecla extra a cada vez).

Mas sou só eu. Se você não espera rodar em ambientes estranhos (outras máquinas, outros usuários, ...) e pode instalar seus aliases favoritos onde quer que esteja, vá à loucura. O Unix é conhecido por oferecer aos usuários corda mais do que suficiente para atirar em seus próprios pés.

vonbrand
fonte
0

As outras respostas são boas, mas todas analisam apenas como isso afeta você.

Deixe-me mudar um pouco a resposta de Stephanie Laswieski.

Supondo que você não seja onisciente, pode ser necessário que outra pessoa trabalhe em sua conta de usuário ou informe-o sobre como fazer algo.

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

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

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

Joe
fonte