mirror of
https://github.com/koalaman/shellcheck.git
synced 2025-10-03 19:29:44 +08:00
Created SC2111 (markdown)
48
SC2111.md
Normal file
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!
|
Reference in New Issue
Block a user