Updated SC2091 (markdown)

koalaman
2015-04-29 09:45:49 -07:00
parent 44553c5b1a
commit bc1512209b

@@ -2,16 +2,30 @@
### Problematic code:
if $(which "false"); then echo "true"; fi
if $(which epstopdf)
then
echo "Found epstopdf"
fi
### Correct code:
if which "false" >/dev/null >2&1; then echo "true"; fi
if which epstopdf
then
echo "Found epstopdf"
fi
### Rationale:
If the `$()` subshell produces an output it will be evaluated by the `if` statement, this could result in the execution of the output, which will result in different behaviour than intended.
ShellCheck has detected that you have a command that just consists of a command substitution.
This is typically done in order to try to get the shell to execute a command, because `$(..)` does indeed execute commands. However, it's also replaced by the output of that command.
When you run `echo "The date is $(date +%F)"`, bash evalutes the `$(..)`. The command then becomes `echo "The date is 2015-04-29"`, which writes out the string `The date is 2015-04-29`
The problem is when you use `$(date +%F)` alone as a command. Bash evaluates the `$(..)`, and the command then becomes `2015-04-29`. There is no command called `2015-04-29`, so you get `bash: 2015-04-29: command not found`.
Sometimes this results in this confounding `command not found` messages. Other times you get even stranger issues, like the example problematic code which always evaluates to false.
### Exceptions:
None.
If you really want to execute the output of a command rather than the command itself, you can ignore this message.