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?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
-
Aliases are expanded when a function definition is read,
not when the function is executed …$ echo "The quick brown fox jumps over the lazy dog." > myfile $ alias myalias=cat $ myfunc() { > myalias myfile > } $ myfunc The quick brown fox jumps over the lazy dog. $ alias myalias="ls -l" $ myalias myfile -rw-r--r-- 1 myusername mygroup 45 Dec 13 07:07 myfile $ myfunc The quick brown fox jumps over the lazy dog.Even though
myfuncwas defined to callmyalias,
and I’ve redefinedmyalias,
myfuncstill executes the original definition ofmyalias.
Because the alias was expanded when the function was defined.
In fact, the shell no longer remembers thatmyfunccallsmyalias;
it knows only thatmyfunccallscat:$ type myfunc myfunc is a function myfunc () { cat myfile } -
… aliases defined in a function are not available
until after that function is executed.$ echo "The quick brown fox jumps over the lazy dog." > myfile $ myfunc() { > alias myalias=cat > } $ myalias myfile -bash: myalias: command not found $ myfunc $ myalias myfile The quick brown fox jumps over the lazy dog.The
myaliasalias isn’t available
until themyfuncfunction 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.)
Method 2
I need the answer that is stated by the first sentence when I try below snippet in my .bashrc.
alias ls='ls -F --color=auto --show-control-chars'
alias ll='ls -ahl'
function lf_macro() {
local CMD=${1:-ls} DIR=${2:-.};
$CMD $(find $DIR -maxdepth 1 -type f);
}
function lf() { lf_macro ll "$1"; }
function lsf() { lf_macro ls "$1"; } # list all file, no directories
after unalias -a; source ~/.bashrc, I try to execute lf and lsf,
$ lf -bash: ll: command not found $ lsf ./file1 ./file2 ./script.sh ... # no color, no control-chars $ ls $(find -maxdepth 1 -type f) ./file1 ./file2 ./script.sh* ...
it seems clearly that aliases are expanded at function definition, not function execution, since:
- when I execute
lf, the error-bash: ll: command not found, and - when I execute
lsf,/usr/bin/lsis used, not the alias form, no color
highlight, and no control chars after executable file.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0