From the bash manual
The rules concerning the definition and use of aliases are somewhat
confusing. Bash always reads at least one complete line of input
before executing any of the commands on that line. Aliases are
expanded when a command is read, not when it is executed. Therefore,
an alias definition appearing on the same line as another command does
not take effect until the next line of input is read. The commands
following the alias definition on that line are not affected by the
new alias. This behavior is also an issue when functions are executed.
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.
The two sentences "Aliases are expanded when a function definition is read, not when the function is executed" and "aliases defined in a function are not available until after that function is executed" seem to be contrary to each other.
Can you explain what they mean respectively?
Best Answer
Aliases are expanded when a function definition is read, not when the function is executed …
Even though
myfunc
was defined to callmyalias
, and I’ve redefinedmyalias
,myfunc
still executes the original definition ofmyalias
. Because the alias was expanded when the function was defined. In fact, the shell no longer remembers thatmyfunc
callsmyalias
; it knows only thatmyfunc
callscat
:… aliases defined in a function are not available until after that function is executed.
The
myalias
alias isn’t available until themyfunc
function has been executed. (I believe it would be rather odd if defining the function that defines the alias was enough to cause the alias to be defined.)