Skip to content
rbenet edited this page Jul 4, 2024 · 4 revisions

This is a file redirection. Was it supposed to be a comparison or fd operation?

Problematic code:

if x > 5; then echo "true"; fi

or

foo > /dev/null 2>1

Correct code:

if (( x > 5 )); then echo "true"; fi

or

foo > /dev/null 2>&1

Rationale:

You are redirecting to or from a filename that is an integer. For example, ls > file where file happens to be 3.

This is not likely to be intentional. The most common causes are:

  1. Trying to compare two numbers, as in x > 5. This should instead be [ "$x" -gt 5 ] or (( x > 5 )).
  2. Trying similarly to compare command output, as in grep -c foo file > 100 instead of [ "$(grep -c foo file)" -gt 100 ]
  3. Malformed FD operations, such as writing 1>2 instead of 1>&2.

If you do want to create a file named 4, you can quote it to silence shellcheck and make it more clear to humans that it's not supposed to be taken numerically.

Exceptions:

If you use the &> form of redirection, as in foo > /dev/null 2&>1, it will trigger this warning. You can safely ignore this warning if that is what triggered it, or change your redirection operator to the semantically preferable >&.

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