Skip to content
Joachim Ansorg edited this page Oct 31, 2022 · 2 revisions

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.

Related resources:

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

ShellCheck

Each individual ShellCheck warning has its own wiki page like SC1000. Use GitHub Wiki's "Pages" feature above to find a specific one, or see Checks.

Clone this wiki locally