ver expansión de alias de comando

67

Si ejecuta el watchcomando que contiene un alias, no expandirá el alias. He intentado con comillas simples y comillas dobles, de hecho, dado el siguiente alias:

# alias ll
alias ll='ls -l --color=tty'

El siguiente comando fallará

# watch ll
sh: ll: command not found

¿No debería funcionar la expansión de línea de comando en este caso?

ztank1013
fuente

Respuestas:

98

Los alias solo se expanden como el primer argumento, o después de otro alias con un espacio final al final del comando.

De bash's help alias:

Un espacio final en VALUE hace que se verifique la sustitución de alias en la siguiente palabra cuando se expande el alias.

Para hacer esto, intente lo siguiente:

alias watch='watch '
alias ll='ls -l --color=tty'
watch ll

Tenga en cuenta que algunas versiones de los watchcolores de banda por defecto, en algunas versiones, esto se puede detener usando --coloro -G.

Chris Down
fuente
1
¡Esta es una respuesta absolutamente increíble! Gracias y +1 por supuesto.
ztank1013
1
Gracias ... Durante todo este tiempo, solía 1. escribir ll, 2. presionar ctrl + alt + e, 3. luego prefijar reloj. Esto es un ahorro de tiempo.
anishsane
10
Desafortunadamente, este método tiene una limitación a la que no puede proporcionar opciones watchporque el alias debe ser la siguiente palabra, mientras que watchnecesita sus argumentos antes de que se ejecute el comando. Si lo intentaste watch -n 10 <alias>, bash no expandirá el alias. Para solucionarlo, necesita un alias que incluya las opciones que desee (por ejemplo, `alias watch-10 = 'watch -n 10'), aún con un espacio final.
indiv
2

¿Quizás podríamos expandir manualmente el alias antes de que watch lo vea?

watch $(alias ll | cut -d\' -f2)

Explicación

La salida de se alias llve así:

$ alias ll
alias ll='ls -lAGh'

Entonces configuramos el delímetro de corte para que sea comilla simple, y cortamos el segundo campo, dejando:

ls -lAGh

es decir, el alias expandido. Eso luego forma los argumentos dados a watch.

Haz una función para hacerlo

function watcha {
    watch $(alias "$@" | cut -d\' -f2)
}

Entonces,

watcha ll

Funciona como se desee. Esto es horrible y fallará en todo tipo de situaciones. Lo siento.

Jonathan Hartley
fuente
0

Pensé que aquí el problema básico es que mientras se ejecuta watch, el argumento se da a " sh -c", lo que significa que si el alias llno está definido en el sh(dash shell's)entorno, no lo expandirá. Pero estaba equivocado y este no es el caso, la respuesta de Chris anterior es correcta.

Sachin Divekar
fuente
2
No exactamente. Tratar watch 'alias ll="ls -l --color=tty"; type ll; ll'.
Chris Down el
+1 para respuesta inmediata para verificarlo. Me equivoqué arriba.
Sachin Divekar
@ChrisDown, así que incluso si el reloj usa " sh -c", su explicación también es aplicable sh. Estoy en lo cierto?
Sachin Divekar
1
Eso depende de qué shell se esté utilizando sh. Nótese que esto hace el trabajo:sh -c $'alias ll="ls -l --color=tty"\ntype ll\nll'
Chris abajo
0

Ejecuté watchun nuevo shell interactivo, que expandirá el alias:

watch -x bash -i -c ll

(El -xtiene la intención de dejar watchde usar su propia sh -cpara envolver nuestra orden dada. No queremos que debido a que necesitamos pasar -ia sho bash, para que sea un shell interactivo, que Bashrc lee y define los alias. Con -x, ejecuta el reloj comando usando exec.)

Gah, en realidad, esto no funciona. Después de mostrar la salida de 'll' una vez, luego de dormir 2 segundos, el trabajo se pone en segundo plano, con un poco enigmático:

1]+  Stopped                 watch -x bash -i -c ll

¿Por qué se detuvo? ¿A dónde fue el aparato ortopédico abierto [? Maldición, pensé que esta sería una gran respuesta, pero no puedo hacer que funcione.

Jonathan Hartley
fuente