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 files you are sourcing whose names are the same but defined differently within their bodies. Then you will see the same error message albeit it will be mysterious at first. However, when invoking ShellCheck! on the ex command line I noticed that the whole definition of the earlier seen definition was ignored. Indeed every message was that every line was unreachable.

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 above to find a specific one, or see Checks.

Clone this wiki locally