error linux

Linux Exit Code 2 - Misuse of Shell Command

Understanding Linux exit code 2 - indicates misuse of a shell built-in command, such as incorrect syntax or invalid arguments.

What It Means

Exit code 2 typically indicates misuse of a shell built-in command. This usually means the command was called with incorrect syntax, invalid options, or wrong number of arguments. Many command-line tools also use exit code 2 to indicate usage errors.

Common Causes

  • Invalid command-line options or flags
  • Wrong number of arguments passed to a command
  • Syntax errors in shell scripts
  • Missing required arguments
  • Invalid flag combinations
  • Incorrect use of shell built-in commands (cd, eval, exec, etc.)

How to Fix

Check command syntax

# Wrong: invalid option
ls --invalid-option
echo $?  # 2

# Right: use valid options
ls --help  # Check available options
ls -la

# Wrong: missing required argument
grep
echo $?  # 2

# Right: provide required arguments
grep "pattern" file.txt

Fix bash script syntax errors

# Wrong: missing 'then'
if [ "$x" -eq 1 ]
  echo "one"
fi

# Right: include 'then'
if [ "$x" -eq 1 ]; then
  echo "one"
fi

# Wrong: using == in test brackets with integers
if [ "$x" == 1 ]; then

# Right: use -eq for numeric comparison
if [ "$x" -eq 1 ]; then

# Wrong: missing spaces in test brackets
if ["$x" -eq 1]; then

# Right: spaces around brackets
if [ "$x" -eq 1 ]; then

Debug syntax errors

# Check script syntax without running it
bash -n script.sh

# Run with debugging output
bash -x script.sh

# Use shellcheck for static analysis
shellcheck script.sh

Common command-specific exit code 2

# grep: exit 2 means an actual error occurred (not just "no match")
grep -Z "pattern" file.txt  # Invalid option on some systems
echo $?  # 2 (usage error, vs 1 for no match)

# tar: exit 2 means a fatal error
tar -xf nonexistent.tar.gz
echo $?  # 2

# diff: exit 2 means trouble (vs 1 for "files differ")
diff file1.txt nonexistent.txt
echo $?  # 2

Handle in scripts

#!/bin/bash

# Validate arguments
if [ $# -lt 2 ]; then
  echo "Usage: $0 <source> <destination>" >&2
  exit 2  # Convention: exit 2 for usage errors
fi

source="$1"
destination="$2"