But why does "do not use alias in compound commands" generalize from function definitions to general compound commands?
É o contrário (seu trecho do manual do bash não está completo). Comandos compostos generalizam para definições de funções que são comandos compostos.
Um comando composto é executado assim que é lido completamente. Os aliases são definidos quando são executados, e não quando são lidos (obviamente). Mas a substituição de alias só ocorre quando o comando é lido.
Tome este comando composto, por exemplo:
$ alias echo='echo Follow my advice:' &&
> echo Alias is a basic substitution mechanism
Alias is a basic substitution mechanism
$ echo Use aliases sparingly
Follow my advice: Use aliases sparingly
Primeiro, você pode ver que, como &&
introduz um comando composto, o shell não executa nada e solicita uma segunda linha de entrada.
Quando este comando composto de duas linhas é lido , os aliases são substituídos antes que o comando seja executado. No momento dessa substituição, o echo
alias ainda não existe e, portanto, nada é substituído. Finalmente, quando todo o comando é executado, este é o comando echo
que é usado, mesmo depois da definição do alias.
Quando o segundo comando echo
é lido , o echo
alias existe e é substituído. O comando que é executado é, portanto, echo Follow my advice: Use aliases sparingly
.
A definição de função é um tipo maior de comando composto, mas o funcionamento é o mesmo. Qualquer definição de alias interna só entra em vigor quando a função é chamada.