Por que não usar alias em comandos compostos?

2

Do manual do bash

Aliases are expanded when a function definition is read, not when the function is executed, because a function definition is itself a compound command. As a consequence, aliases defined in a function are not available until after that function is executed. To be safe, always put alias definitions on a separate line, and do not use alias in compound commands.

Eu entendo pode haver algum problema em potencial de usar alias em uma definição de função , embora ainda tenha algumas dúvidas sobre Qual das seguintes operações de shell são executadas dentro do corpo da função ao executar uma definição de função e ao chamar uma função? .

Mas por que "não usar alias em comandos compostos" generaliza a partir de definições de funções para comandos compostos gerais?

Quais outros tipos de comandos compostos podem ter quais tipos de problemas com alias?

    
por Tim 05.08.2017 / 18:50

1 resposta

4

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.

    
por 05.08.2017 / 23:50

Tags