On Fri, May 12, 2017 at 7:33 AM, Gabor Burjan <b...@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).