Created SC2111 (markdown)

Vidar Holen
2021-12-11 16:55:40 -08:00
parent b462ea48d1
commit 50cbe8f312

48
SC2111.md Normal file

@@ -0,0 +1,48 @@
## ksh does not allow 'function' keyword and '()' at the same time.
### Problematic code:
```sh
#!/bin/ksh
function foo() {
echo "Hello World"
}
```
### Correct code:
```sh
# POSIX sh function
foo() {
echo "Hello World"
}
```
or
```sh
# 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!