Ejecuta un comando sombreado por un alias

164

Digamos que tengo el siguiente alias en bash alias ls='ls --color=auto'- y quiero llamar a ordinario lssin opciones. ¿La única forma de hacerlo es unalias, hacer el comando y luego alias nuevamente? ¿O hay algún truco ingenioso o solución alternativa?

Mirzhan Irkegulov
fuente
2
Solo una nota sobre algunas de las respuestas a continuación: "comando" es la ÚNICA forma segura de lograr esto. Por ejemplo, el "." o "fuente" incorporada puede ser anulada por una función definida por script. "comando". o "fuente de comando" es la única forma de ejecutar la fuente de forma segura sin invocar la función definida por el script. Ninguna de las otras alternativas, incluido el método de barra invertida "\.", Funciona y, por supuesto, no existe una alternativa "/ bin / source" que pueda invocar especificando una ruta completa.
Dejay Clayton

Respuestas:

211

También puede prefijar una barra diagonal inversa para deshabilitar el alias: \ls

Editar: Otras formas de hacer lo mismo incluyen:

Utilice "comando": command lssegún Mikel .

Utilice la ruta completa: /bin/lssegún Uther .

Cita el comando: "ls"o 'ls'según el comentario de Mikel.

Puede eliminar el alias temporalmente para esa sesión de terminal con unalias command_name.

Ahora no
fuente
Esta es mi forma estándar de hacer esto.
ncmathsadist
muy agradable, también funciona bien con tcsh
Levon
10
De esta manera es muy útil. Solo omite los alias, no las funciones, lo que lo hace diferente de commando builtin.
Mikel
1
Parece que l\shace lo mismo. ¿Es este comportamiento un error o una característica?
Niklas B.
44
Es una "característica". Solo los alias sin comillas se expanden. Por lo tanto, puede ponerlo entre comillas o usar una barra diagonal inversa en cualquier lugar que desee. Ver referencia de alias bash .
Mikel
79

Para eso es el commandcomando.

Tratar

command ls

Esto le dice al shell que omita los alias y las funciones.

De esta manera es compatible con bash , zsh y ash / dash.

Mikel
fuente
2
La mejor respuesta, ¿por qué no es la más votada? :) +1
0xC0000022L
11
Porque agrega 8 veces el número de caracteres como método de barra invertida
JoelFan
1
@STATUS_ACCESS_DENIED Esto tampoco funciona con tcsh (y, por lo tanto, presumiblemente tampoco con csh). El método `\` lo hace
Levon
3
La función de barra invertida no es segura. Si bien brinda protección contra alias con nombres similares, no brinda protección contra funciones con nombres similares.
Dejay Clayton
2
@JoelFan Prefiero tener los pocos caracteres adicionales y que mis guiones sean fáciles de seguir y funcionen para todos. En lugar de una barra críptica que no es intuitiva, fácil de omitir, no está bien documentada y no funciona para omitir funciones.
Dennis
19

El alias es solo un acceso directo definido. En este ejemplo, el alias definido es la cadena ls, que se ejecuta ls --color=auto. Si no desea ese comportamiento, puede llamar al binario lsutilizando la ruta absoluta.

Entonces ejecutar solo /bin/lsproducirá resultados sin color porque no es el alias que definió.

También puede cambiar el alias a algo diferente o agregar un nuevo alias que se ejecute lssin los parámetros de color.

George M
fuente
2
Tienes que saber dónde está el comando. En algunos sistemas, la división entre /biny /usr/bines arbitraria.
Keith Thompson,
@KeithThompson Para ello, se podría utilizar whichpara algunos comandos: which ls.
cst1992
@ cst1992: si va a usar which(o type), realiza una búsqueda a través de $PATH; también podría usar lso en \lslugar de especificar la ruta.
Keith Thompson
10

Otra forma, sobre la base de la respuesta de @ uther, es usar $(which ...)o `which ...`(usando backticks ``) para encontrar automáticamente la ruta del ejecutable. Esto funcionará en bash:

$(which ls)

`which ls`

Sin lugar a dudas, simplemente prefijar el comando con a \es mucho más corto.

ACTUALIZACIÓN : ¿Cómo utilizar `which` en un comando con alias? , esto no parece ser confiable en absoluto.

krlmlr
fuente
¿Para qué sirven los corchetes? Supongo que te refieres `which ls`a ejecutar el binario directamente.
amyassin
2
@amyassin: Ambas sintaxis son equivalentes. (Por cierto, ¿cómo obtuvo los backticks en el formato del código?)
krlmlr
En realidad (which ls), no funcionó para mí (en Ubuntu 12.04 LTS) Y los backticks fueron duros, simplemente escapé de ellos: \ `which ls \`. Tomó mucha edición llegar allí :)
amyassin
1
@ user946850 "Para incluir un carácter de retroceso literal dentro de un intervalo de código, puede usar múltiples retrocesos como delimitadores de apertura y cierre". Fuente: Markdown Reference .
Mikel
@amyassin: ¿Agregaste el $?
krlmlr
2

Personalmente, evito definir alias con los mismos nombres que los comandos, por lo que lssiempre invoca el comando real. Tengo alias o funciones para diferentes combinaciones de opciones como l, ll, y lg. (Esto significa que necesito unalias lsen mi .bashrco .cshrc.)

Encuentro que las suposiciones del sistema operativo sobre las opciones que podría preferir (anulando las suposiciones de los diseñadores del lscomando en sí) rara vez coinciden con mis gustos personales. Resulta que no me gusta el aspecto de ls --color=auto, y su legibilidad puede variar mucho entre negro sobre blanco y blanco sobre negro.

YMMV, y las otras soluciones, por supuesto, aún son buenas para conocer.

Keith Thompson
fuente
1

Escribir el comando en mayúsculas parece funcionar LS, aunque no estoy seguro de por qué.

asmeurer
fuente
44
¿En qué shell, qué sistema operativo, qué terminal, etc.?
Mikel
@Mikel Hay un paquete "sl" que proporciona "sl" como "ls". Los consejos que da bash en Ubuntu también dicen que "LS" es proporcionado por "sl".
Izkata
1
Esto es bash 4 (instalado con Fink) en Mac OS X 10.7. También funciona para otros comandos que he alias como rm y grep.
asmeurer
3
Es solo una broma :) de la página mn:LS - display animations aimed to correct users who accidentally enter LS instead of ls.
amyassin
77
Creo que esto funciona para Mac OS X porque su sistema de archivos no distingue entre mayúsculas y minúsculas por defecto. No funcionará en otros unixes.
Enero