¿Cómo deshacer un menos?


83

Mi café de la mañana aún no había llegado a mi cerebro cuando olvidé las citas en:

alias grep="grep --color=always"

así que en su lugar escribí:

alias grep=grep --color=always

dejándome con:

--color=always
grep=grep

en mis alias

Cuando intento limpiar --color = siempre usando unalias --color, obtengo:

bash: unalias: --: invalid option
unalias: usage: unalias [-a] name [name ...]

Intenté escapar, citar y rogar, pero no puedo entender cómo hacer que el comando unalias limpie el desorden.

(Sé que un reinicio hará el truco, pero seguramente debe haber otra forma)


13
Ja, ja, ahora lo tengo pegado en la mía también, trabajar en él EDIT: Parece que la respuesta de choroba trabajó para mí
asmith

99
Algo me recuerda a la vieja echo > \\?\c:\windows\x., o esa vez que rm -rf * ~por accidente.
Jason C

Respuestas:


127

Puede evitar que los sistemas compatibles con POSIX interpreten guiones en los comandos agregando --antes de cualquier argumento.

mtak@frisbee:~$ alias grep=grep --color=always
mtak@frisbee:~$ alias | grep color
alias --color='always'

mtak@frisbee:~$ unalias -- --color
mtak@frisbee:~$ alias | grep color
mtak@frisbee:~$

Esto también funciona con otras utilidades, digamos que tiene un archivo llamado -bla. Si intenta eliminarlo rm, obtendrá el siguiente error:

mtak@frisbee:~$ ls -- -bla
-bla
mtak@frisbee:~$ rm -bla
rm: invalid option -- 'b'
Try 'rm ./-bla' to remove the file '-bla'.
Try 'rm --help' for more information.

Al usar --antes del nombre de archivo, eliminará el archivo:

mtak@frisbee:~$ rm -- -bla
mtak@frisbee:~$ ls -- -bla
ls: cannot access '-bla': No such file or directory

19
Aunque vale la pena señalar que para los archivos, un método igualmente válido es utilizar una ruta al archivo que evite esto; para que pueda usar ls ./-blay rm ./-bla(o especificar las rutas completas, lo que sea más fácil en su caso). ¡Obviamente, esto no funciona para los alias!
Muzer


93

Solo usa el mismo truco que usaste para establecer el alias

unalias whatever --color

99
funciona de hecho, +1 pero la otra solución es un poco más limpia :)
Requist

1
De hecho, por supuesto :-)
choroba

unalias unalias --color
Cœur

3

Solución rápida

Para solucionar tanto los alias equivocadas que pueden funcionar simplemente

unalias grep --color


Entendiendo lo que pasó

Usted da el comando equivocado alias grep=grep --color=alwayssin "...".

  • Estableces dos alias --color y grep; de hecho, puede leerlo en el lado izquierdo de su salida (todo a la izquierda =es un comando con alias):

    --color=always
    grep=grep

    entonces necesitas desarmar ambos.

  • ¿Por qué sucedió esto?
    El ...sinóptico de alias significa que es posible hacer asignaciones múltiples en una línea:

    alias: alias [-p] [nombre [= valor] ...]

    En la salida de help aliaspuede leer el sinóptico, pero desde man bashusted puede leer que es posible en la misma línea incluso enumerar y asignar al mismo tiempo:

    Cuando se proporcionan argumentos, se define un alias para cada nombre cuyo valor se proporciona. Un espacio final en el valor hace que se verifique la sustitución de alias en la siguiente palabra cuando se expande el alias. Para cada nombre en la lista de argumentos para el que no se proporciona ningún valor, se imprime el nombre y el valor del alias ...

  • Tiene problemas para desarmar el primero --colorsolo .
    Esto porque se interpreta como opciones para aliasque su concha; Para evitar esto, debe comunicarle a su bashshell que lo que sigue no es una opción.

  • El Santo Grial de Linux:man en este caso, man bashes un cofre lleno de tesoros útiles en situaciones como esta.
    Puedes leer de man bash:

    - A - señala el final de las opciones y deshabilita el procesamiento adicional de opciones. Cualquier argumento después de - se trata como nombres de archivo y argumentos . Un argumento de - es equivalente a -.

    Como se informó en otra respuesta, la forma POSIX es utilizar la combinación de caracteres especiales --.

    unalias -- --color
  • ¿unalias grep --color Pero por qué está funcionando? Quiero decir sin usar --?
    Como funcionó aliasincluso para unaliases posible dar más de un nombre a la vez (de nuevo el [...]).

    unalias: unalias [-a] name [name ...]

    Solo puedo dar mi suposición: un buen hábito de programación es escribir las rutinas de lectura y escritura al mismo tiempo, por debajo de la misma lógica. Por lo tanto, tiene que ser para la opción analizar las rutinas de aliasy unalias.

    Esto puede funcionar incluso desde este comando (desde un shell abierto para este propósito) que no borrará todos sus alias:

    unalias whatever -a

Comentario final

En la sección ERRORES de man bashentre las pocas cosas informadas, puede leer:-)

Los alias son confusos en algunos usos.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.