Alias and functions

  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 myfunc was defined to call myalias, and I’ve redefined myalias, myfunc still executes the original definition of myalias.  Because the alias was expanded when the function was defined.  In fact, the shell no longer remembers that myfunc calls myalias; it knows only that myfunc calls cat:

    $ type myfunc
    myfunc is a function
    myfunc ()
    {
    cat myfile
    }
  2. … 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 myalias alias isn’t available until the myfunc 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.)