2 SC2111
Joachim Ansorg edited this page 2022-10-31 15:26:22 +01:00

ksh does not allow function keyword and () at the same time.

Problematic code:

#!/bin/ksh
function foo() {
  echo "Hello World"
}

Correct code:

# POSIX sh function
foo() {
  echo "Hello World"
}

or

# ksh extended function
function foo {
  echo "Hello World"
}

Rationale:

Ksh allows two ways of defining functions: POSIX sh style foo() { ..; } and Ksh specific function foo { ..; }.

ShellCheck found a function definition that uses both at the same time, function foo() { ..; } which is not allowed. Use one or the other.

Note that the two are not identical, for example:

  • Using typeset in a function foo will create a local variable, while in foo() it will create a global variable.
  • function foo has its own trap context, while foo() shares them with the current process.
  • function foo will set $0 to foo, while foo() will inherit $0 from the current process.

Exceptions:

In Bash, function foo() { ..; } is allowed, and function foo and foo() are identical. This warning does not trigger when the shebang is e.g. #!/bin/bash.

  • Help by adding links to BashFAQ, StackOverflow, man pages, POSIX, etc!