bug-bash
[Top][All Lists]
Advanced

[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).



reply via email to

[Prev in Thread] Current Thread [Next in Thread]