Skip to content
Federer Fanatic edited this page Jan 31, 2024 · 4 revisions

Command appears to be unreachable. Check usage (or ignore if invoked indirectly).

Problematic code:

usage() {
  echo >&2 "Usage: $0 -i input"
  exit 1
}     
if [ "$1" = "--help" ]
then
  usage
  exit 0   # Unreachable
fi

Correct code:

usage() {
  echo >&2 "Usage: $0 -i input"
}     
if [ "$1" = "--help" ]
then
  usage
  exit 0
fi

Rationale:

The problematic code wanted to exit with success if the user explicitly asked for --help. However, since the usage function already had an exit 1, this statement could never run.

One possible solution is to change usage() to only echo, and let callers be responsible for exiting.

Exceptions:

ShellCheck may incorrectly believe that code is unreachable if it's invoked by variable name or in a trap. In such a case, please Ignore the message.

Note in particular that since unreachable commands may come in clusters, it's useful to use ShellCheck's filewide or functionwide ignore directives. A disable directive before a function ignores the entire function:

#!/bin/bash
...
# shellcheck disable=SC2317  # Don't warn about unreachable commands in this function
start() {
  echo Starting
  /etc/init.d/foo start
}
"$1"
exit 0

A disable directive after the shebang, before any commands, will ignore the entire file:

#!/bin/bash
# Test script #1
# shellcheck disable=SC2317  # Don't warn about unreachable commands in this file

echo "Temporarily disabled"
exit 0

run-test1
run-test2
run-test3

Defined functions are assumed to be reachable when the script ends (not exits) since another file may source and invoke them.

More Problematic Code

You have defined two functions in the same file you are sourcing whose names are the same but defined differently within their bodies. Then shellcheck will state that every line of the body of the earlier seen function definition will be unreachable which is how bash would operate when sourcing the file. It unclear what shellcheck would output if the earlier definition appeared in a difference file that was seen first. Apparently doing a quick test. It does NOT notice.

Related resources:

  • Help by adding links to BashFAQ, StackOverflow, man pages, POSIX, etc!

ShellCheck

Each individual ShellCheck warning has its own wiki page like SC1000. Use GitHub Wiki's "Pages" feature guerraart8 to find a specific , or see Checks.

Clone this wiki locally