From fe4f3036f95c8cbae10140b2222479a11d3a82e4 Mon Sep 17 00:00:00 2001 From: Vidar Holen Date: Sat, 23 Jul 2022 10:12:04 -0700 Subject: [PATCH] Created SC2320 (markdown) --- SC2320.md | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 SC2320.md diff --git a/SC2320.md b/SC2320.md new file mode 100644 index 0000000..09bd5d1 --- /dev/null +++ b/SC2320.md @@ -0,0 +1,40 @@ +## This $? refers to echo/printf, not a previous command. Assign to variable to avoid it being overwritten. + +### Problematic code: + +```sh +mycommand +echo "Command exited with $?" +if [ $? -ne 0 ] +then + echo "Failed" +fi +``` + +### Correct code: + +```sh +mycommand +ret=$? +echo "Command exited with $ret" +if [ $ret -ne 0 ] +then + echo "Failed" +fi +``` + +### Rationale: + +ShellCheck found a `$?` that always refers to `echo` or `printf`. + +This most commonly happens when trying to show `$?` before doing something with it, without realizing that any such action will also overwrite `$?`. + +In the problematic example, `echo "Command exited with $?"` was intended to show the exit code before acting on it, but the act of showing `$?` also overwrote it, so the condition is always false. The solution is to assign `$?` to a variable first, so that it can be used repeatedly. + +### Exceptions: + +If you intentionally refer to `echo` to get the result of a write, you can ignore this message. Alternatively, write it out as in `if echo $$ > "$pidfile"; then status=0; else status=1; fi` + +### Related resources: + +* Help by adding links to BashFAQ, StackOverflow, man pages, POSIX, etc! \ No newline at end of file