Alias ​​Loop en csh

¿Por qué se crea un error de bucle Alias ​​aquí?

alias df 'printf "\n"; df -hP | column -t' 

Pero no aquí:

 alias df 'df -hP | column -t' 

Me doy count de que podría llamar al alias otra cosa y seguir funcionando, sin embargo, estoy tratando de entender la operación subyacente.

Related of "Alias ​​Loop en csh"

Parece que cuando el nombre de alias también es el primer command, no se interpreta como un alias, pero más allá de eso. Esto se puede solucionar con la ruta absoluta:

 alias df 'printf "\n"; /bin/df -hP | column -t' 

O, como señaló Keith en un comentario y respuesta, \ impide la expansión de alias:

 alias df 'printf "\n"; \df -hP | column -t' 

Esto se explica en la página man de tcsh (sospecho que está usando tcsh, no csh); ver el tercer párrafo citado.

El shell mantiene una list de alias que se pueden establecer, deshacer e imprimir con los commands alias y unalias . Después de que una línea de command se analiza en commands simples (ver Comandos ) se verifica la primera palabra de cada command, de izquierda a derecha, para ver si tiene un alias. Si es así, la primera palabra es reemplazada por el alias. Si el alias contiene una reference de historial, sufre una sustitución de historial (qv) como si el command original fuera la línea de input anterior. Si el alias no contiene una reference de historial, la list de arguments no se modifica.

Por lo tanto, si el alias de `ls 'fuera` ls -l', el command `ls / usr 'se convertiría en` ls -l / usr', y la list de arguments no se alteraría. Si el alias para `lookup 'fuera` grep! ^ / Etc / passwd' entonces `lookup bill 'se convertiría en` grep bill / etc / passwd'. Los alias se pueden usar para introducir la metasintata del analizador. Por ejemplo, `alias print 'pr! * | lpr '' define un “ command '' (`print ') que pr (1) s sus arguments a la impresora de línea.

La sustitución de alias se repite hasta que la primera palabra del command no tenga alias. Si una sustitución de alias no cambia la primera palabra (como en el ejemplo anterior), se marcará para evitar un bucle. Se detectan otros loops y causa un error.

Una buena solución es preceder a un command con un carácter \ para nhibernate la expansión de alias:

 alias df 'printf "\n"; \df -hP | column -t'