3
bash -c 'shopt -s expand_aliases

a() {
    alias myfunc="echo myfunc"
}

main() {
    a
    myfunc
}

main'

a function is used to alias some commands, which are used in main function.

Output:

environment: line 8: myfunc: command not found
oguz ismail
  • 1
  • 16
  • 47
  • 69
FH0
  • 61
  • 1
  • 5

1 Answers1

5

This is expected behavior, explained in the manual as follows:

Aliases are expanded when a function definition is read, not when the function is executed, because a function definition is itself a command.

In this case that means myfunc in main is not going to be expanded to echo myfunc unless your script calls a to define it above the definition of main.

The shell does not execute commands inside a function definition until that function is called. So, defining a above main doesn't make any difference; myfunc isn't defined until a is called.

Compare these two:

$ bash -O expand_aliases -c '
foo() { bar; }
alias bar=uname
foo'
environment: line 1: bar: command not found
$ bash -O expand_aliases -c '
alias bar=uname
foo() { bar; }
foo'
Linux

The workaround is to avoid using aliases in shell scripts. Functions are way better.

oguz ismail
  • 1
  • 16
  • 47
  • 69