[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: unalias works weirdly inside an if-then block
From: |
Eduardo Bustamante |
Subject: |
Re: unalias works weirdly inside an if-then block |
Date: |
Fri, 12 May 2017 08:11:35 -0500 |
On Fri, May 12, 2017 at 7:33 AM, Gabor Burjan <buga@buvoshetes.hu> wrote:
[...]
> Description:
> unalias works weirdly inside an if-then block
It's not just an if-then block. It's any kind of block:
dualbus@debian:~$ bash alias
+ shopt -s expand_aliases
+ alias 'x=echo x'
+ echo x
x
+ unalias x
+ echo x
x
+ x
alias: line 9: x: command not found
dualbus@debian:~$ cat alias
set -x
shopt -s expand_aliases
alias x='echo x'
x
{
unalias x
x
}
x
This is explained in the ALIASES section of 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 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 key part here is that aliases are expanded when a command is
read, not when it's executed. Bash needs to parse the whole block, at
which point the alias is expanded. The unalias is not executed but
until after).