Use single quotes, otherwise this expands now rather than when signalled. Open
trap "pkill -P $$" EXIT
- Read upRead up
- Exclude checks
Use single quotes, otherwise this expands now rather than when signalled.
Problematic code:
trap "echo \"Finished on $(date)\"" EXIT
Correct code:
trap 'echo "Finished on $(date)"' EXIT
Rationale:
With double quotes, all parameter and command expansions will expand when the trap is defined rather than when it's executed.
In the example, the message will contain the date on which the trap was declared, and not the date on which the script exits.
Using single quotes will prevent expansion at declaration time, and save it for execution time.
Exceptions
If you don't care that the trap code is expanded early because the commands/variables won't change during execution of the script, or because you want to use the current and not the future values, then you can ignore this message.
Notice
Original content from the ShellCheck https://github.com/koalaman/shellcheck/wiki.
Tips depend on target shell and yours is unknown. Add a shebang. Open
#/bin/bash
- Read upRead up
- Exclude checks
Tips depend on target shell and yours is unknown. Add a shebang.
Problematic code:
echo "$RANDOM" # Does this work?
Correct code:
#!/bin/sh
echo "$RANDOM" # Unsupported in sh. Produces warning.
or
#!/bin/bash
echo "$RANDOM" # Supported in bash. No warnings.
Rationale:
Different shells support different features. To give effective advice, ShellCheck needs to know which shell your script is going to run on. You will get a different numbers of warnings about different things depending on your target shell.
ShellCheck normally determines your target shell from the shebang (having e.g. #!/bin/sh
as the first line). The shell can also be specified from the CLI with -s
, e.g. shellcheck -s sh file
.
If you don't specify shebang nor -s
, ShellCheck gives this message and proceeds with some default (bash
).
Note that this error can not be ignored with a [[directive]]. It is not a suggestion to improve your script, but a warning that ShellCheck lacks information it needs to be helpful.
Exceptions
None. Please either add a shebang or use -s
.
Notice
Original content from the ShellCheck https://github.com/koalaman/shellcheck/wiki.
Quote this to prevent word splitting. Open
wait $(jobs -p)
- Read upRead up
- Exclude checks
Quote this to prevent word splitting
Problematic code:
ls -l $(getfilename)
Correct code:
# getfilename outputs 1 file
ls -l "$(getfilename)"
# getfilename outputs multiple files, linefeed separated
getfilename | while IFS='' read -r line
do
ls -l "$line"
done
Rationale:
When command expansions are unquoted, word splitting and globbing will occur. This often manifests itself by breaking when filenames contain spaces.
Trying to fix it by adding quotes or escapes to the data will not work. Instead, quote the command substitution itself.
If the command substitution outputs multiple pieces of data, use a loop instead.
Exceptions
In rare cases you actually want word splitting, such as in
gcc $(pkg-config --libs openssl) client.c
This is because pkg-config
outputs -lssl -lcrypto
, which you want to break up by spaces into -lssl
and -lcrypto
. An alternative is to put the variables to an array and expand it:
args=( $(pkg-config --libs openssl) )
gcc "${args[@]}" client.c
The power of using an array becomes evident when you want to combine, for example, the command result with user-provided arguments:
compile () {
args=( $(pkg-config --libs openssl) "${@}" )
gcc "${args[@]}" client.c
}
compile -DDEBUG
+ gcc -lssl -lcrypto -DDEBUG client.c
Notice
Original content from the ShellCheck https://github.com/koalaman/shellcheck/wiki.