Alias Loop no csh

2

Por que há um erro de loop de alias criado aqui:

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

Mas não aqui:

alias df 'df -hP | column -t'

Eu percebo que eu poderia chamar o alias de outra coisa e ainda assim dar certo, no entanto, estou tentando entender a operação subjacente.

    
por vol7ron 09.01.2012 / 22:40

2 respostas

5

Parece que quando o nome do alias é também o primeiro comando, ele não é interpretado como um alias, mas além disso é. Isso pode ser trabalhado com o caminho absoluto:

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

Ou, como Keith apontou em um comentário e resposta, \ previne expansão de alias:

alias df 'printf "\n"; \df -hP | column -t'
    
por 10.01.2012 / 04:07
6

Isso é explicado na página man do tcsh (suspeito que você esteja usando tcsh, não csh); veja o terceiro parágrafo citado.

The shell maintains a list of aliases which can be set, unset and printed by the alias and unalias commands. After a command line is parsed into simple commands (see Commands) the first word of each command, left-to-right, is checked to see if it has an alias. If so, the first word is replaced by the alias. If the alias contains a history reference, it undergoes History substitution (q.v.) as though the original command were the previous input line. If the alias does not contain a history reference, the argument list is left untouched.

Thus if the alias for 'ls' were 'ls -l' the command 'ls /usr' would become 'ls -l /usr', the argument list here being undisturbed. If the alias for 'lookup' were 'grep !^ /etc/passwd' then 'lookup bill' would become 'grep bill /etc/passwd'. Aliases can be used to introduce parser metasyntax. For example, 'alias print 'pr !* | lpr'' defines a ''command'' ('print') which pr(1)s its arguments to the line printer.

Alias substitution is repeated until the first word of the command has no alias. If an alias substitution does not change the first word (as in the previous example) it is flagged to prevent a loop. Other loops are detected and cause an error.

Uma boa solução é preceder um comando com um caractere \ para inibir a expansão de alias:

alias df 'printf "\n"; \df -hP | column -t'
    
por 10.01.2012 / 02:11

Tags