Pattern: Redirecting to an integer in shell script
Issue: -
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:
- Trying to compare two numbers, as in
x > 5
. This should instead be[ "$x" -gt 5 ]
or(( x > 5 ))
. - Trying similarly to compare command output, as in
grep -c foo file > 100
instead of[ "$(grep -c foo file)" -gt 100 ]
- Malformed FD operations, such as writing
1>2
instead of1>&2
.
Example of incorrect code:
if x > 5; then echo "true"; fi
or
foo > /dev/null 2>1
Example of correct code:
if (( x > 5 )); then echo "true"; fi
or
foo > /dev/null 2>&1
None. 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.