¿Por qué no se recomienda el alias sobre los comandos estándar?

19

Por ejemplo, un alias común que he visto en el ~/.bashrcarchivo (o equivalentes) es

alias rm='rm -i'

Sin embargo, he visto a personas recomendar contra esto porque

  1. Es posible que el alias no exista en otro sistema y, dado que te has descuidado rm, eliminas inadvertidamente algo importante. [1]
  2. Al usar este alias, en efecto, te entrenas para escribir yo yesdespués de cada rmcomando, lo que anula todo el propósito.

¿Hay otras razones para recomendar en contra de esto? ¿Podrían algunos programas simplemente hacer llamadas en rmlugar de \rm, y el alias podría causarles problemas?

Lo uso rmsimplemente como ejemplo, pero también he visto otros comandos como cpo mvcubiertos por alias. Personalmente, me estoy entrenando lentamente para usar un alias como este en lugar de rm -i:

alias trash=`mv -v -t $HOME/.Trash`
Ricardo Altamirano
fuente
3
Cada vez que me tropiezo con un sistema con un alias predeterminado de rm -i, me entrena un poco más para agregar automáticamente la -fbandera.
Jander
Puedes alias rm -ia lo que quieras. Tales como del, irmetc. No necesita alias rm. Esto evita el punto 1, y usando selectivamente delo rmdependiendo de lo que desee, también evita el punto 2 hasta cierto punto.
Martin Tournoij

Respuestas:

8

Suponiendo que está utilizando bash, esto no debería causar problemas para los scripts, ya que los shells de bash no interactivos no se originan ~/.bashrco ~/.bash_profile(lo que probablemente sea donde se ubican sus alias, o es el primer paso para obtener sus alias en otro script) . Sin embargo, puede causar problemas si está comprando scripts:

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

Su pregunta cubre la mayor parte de la preocupación general sobre el alias sobre los comandos existentes, el principal es que los entornos desconocidos que parecen ser los mismos a primera vista podrían producir resultados muy diferentes. Por ejemplo, aliasing rma rm -itiene buenas intenciones, pero es malo en la práctica por las razones que estatales.

Chris Down
fuente
7

"¿Hay otras razones para recomendar en contra de esto?"

Por supuesto:

(3) Porque un día espero agregar a los cimientos construidos por las personas [-----------] y paranoicas que castigan a los demás por aliasar los comandos estándar, aunque el alias de los comandos estándar es, bueno, estándar .

En serio, estas son solo advertencias. Si confías en ti mismo para no caer en ninguno de esos pozos de fatalidad, entonces ten cuidado y sigue adelante.

Personalmente, alias muy pocos comandos estándar; Utilizo ligeras variaciones porque soy, solo un poco, paranoico y anal retentivo. Pero un buen uso que he encontrado para esto es con respecto a los sistemas en los que a menudo inicio sesión como root u otro usuario, y hay algunas cosas que no quiero ejecutar accidentalmente / con pereza como root:

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

o

alias irc="su irc_user"
encerrada dorada
fuente
4

Como un ejemplo extremo, permítanme alias un comando estándar para ilustrar por qué el alias de comandos estándar puede ser dañino:

alias ls='rm'

Obviamente, esto es malo porque causaría una desagradable sorpresa algún día. Del mismo modo, reemplazar los comandos estándar con alias eventualmente conducirá a una desafortunada sorpresa cuando menos lo espere.

Pero permítanme presentar un escenario común que le sucederá a casi todos los administradores de Unix a medida que avancen en su carrera:

Algún día en el futuro, comenzará un nuevo trabajo y trabajará en un nuevo sistema que fue configurado por otros. Serán las tres de la mañana del sábado y no estás pensando bien y eres propenso a cometer errores. Su entorno estándar no estará disponible. De hecho, eres root.

Dado esto, ¿vas a recordar que rmno tiene alias rm -i? ¿Va a verificar sus alias especiales cada vez que inicie sesión en el cuadro? Si cambia el entorno de la raíz, ¿sus compañeros de trabajo estarán contentos con su cambio?

Sinceramente, estoy en la cerca sobre esto. He trabajado en miles de sistemas en mi carrera, y si modificara el entorno en todos estos sistemas, sería difícil ver el valor.

Aliasing rma rm -ies muy común y lo he visto a prevenir muchos problemas, pero también ha causado muchas sorpresas y horas de trabajo extra para recuperar archivos borrados accidentalmente.

Así que ahora trato de evitar el alias de los comandos comunes del sistema. En cambio, uso alias y funciones para hacer cosas que Shell no puede hacer fácilmente. Lo que tiendo a hacer ahora es adjuntar una letra adicional al 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 ; }

Y tal vez realmente debería deshacerme de mi alias final, porque adaptarme a las nuevas prácticas lleva tiempo:

# For safety!
alias rm='rm -i'
Stefan Lasiewski
fuente
8
Recordar las banderas para lspodría ser más conveniente que recordar diez alias.
Bernhard
Muy cierto. Y, de hecho, rara vez uso estos alias. No estoy seguro de por qué todavía los tengo, aparte de los alias (y funciones) más complicados, fueron difíciles de entender y son buenos para referencia. Por simplicidad, probablemente debería eliminarlos.
Stefan Lasiewski
La "ilustración" (primer ejemplo) no es realmente útil. Eso es claramente malicioso, y sabemos que la trampa de un sistema puede ser perjudicial. Tu rm-> rm -iejemplo es mucho mejor. Otra buena sería una que alias rm para poner las cosas en un~/.trash
derobert 05 de
1
@Bernhard: Cierto, pero los alias son más rápidos de escribir. (Pero diez son demasiados, independientemente).
Emanuel Berg
2
@StefanLasiewski: Sugerencia: nunca elimine cosas que no se muestran, por razones puramente estéticas. Deja que permanezcan a menos que te molesten activamente. Es un acto tan rápido eliminar cosas después de pasar horas configurándolo; y si alguna vez te arrepientes, te sientes como un idiota por no solo dejarlos ser.
Emanuel Berg
4

Hay más peligros en ello.

Por ejemplo, si usa shell-commandEmacs, puede pensar que obtiene "su" comando (o alias , pero no tiene que pulsar un lsalias en un terminal tantas veces antes de olvidarse de configurar el alias, pensando en como cualquier otro comando ...) - de hecho (de vuelta a Emacs), obtienes el comando (sin alias). ¡Emacs lo ejecutará sin problemas, por lo que incluso podría estar ciego ante lo que acaba de suceder!

En cuanto a las diferentes computadoras y / o sistemas, si cree que es demasiado tedioso configurar .rcarchivos individuales para todos ellos, puede tener uno de esos archivos, pero con ifcláusulas para personalizar.

Por ejemplo, en lugar de evaluar cada función cuando las escribe, justo cuando experimente problemas con alguna de ellas, agréguelas a la "lista negra", por último:

if [[ `uname` == "SunOS" ]]; then
  unset -f mic cpkeep mcp mcph cpindex cpconf # not for Solaris
fi
Emanuel Berg
fuente
3

Cambiar el nombre de los comandos estándar por alias (es decir, el rm=rm -imaterial) ciertamente puede conducir a sorpresas donde el alias no está disponible. Yo prefiero no utilizar tales, y (por varias experiencias amargas, amargas ;-) Me he vuelto a leer acustomed cada comando dos veces, y si es rmo mvo cualquier otra cosa tres veces potencialmente destructiva. Y tales alias conducen a "rm foo" ENTER "y" ¡Vaya! de todos modos (y cuesta una pulsación de tecla adicional cada vez).

Pero solo soy yo. Si no espera correr en entornos extraños (otras máquinas, otros usuarios, ...) y puede instalar sus alias favoritos donde quiera que esté, enloquezca. Unix es famoso por dar a los usuarios más que suficiente cuerda para disparar a sus propios pies.

vonbrand
fuente
0

Las otras respuestas son buenas, pero todas solo miran cómo te afecta.

Déjame cambiar un poco la respuesta de @Stephan Laswieski en su cabeza.

Suponiendo que no eres omnisciente, es posible que necesites que alguien más trabaje en tu cuenta de usuario o te aconseje sobre cómo hacer algo.

Luego, cuando hacen algo o le dicen que lo haga, puede que no funcione como se esperaba.

En el mejor de los casos, tendrá que perder el tiempo explicándoles lo que sucedió (si está allí y puede recordar o descubrir que el alias es lo que causó el problema).

En el peor de los casos, vea un giro en el ejemplo en una de las otras respuestas: alias ls = 'rm -rf'.

Joe
fuente