SC3021 – ShellCheck Wiki

See this page on GitHub


In POSIX sh, >& filename (as opposed to >& fd) is undefined.

Note: ShellCheck 0.8.0 and below would trigger this warning on the perfectly POSIX compatible construct >& fd. If you are using >& to copy an integer file descriptor, please ignore this warning.

Problematic code:

# Writing to a filename
mycommand >& log.txt

Correct code:

mycommand > log.txt 2>&1

The following construct is also fine, as it uses an integer file descriptor instead of a filename:

mycommand >& $fd


There are two forms of the >& file descriptor operator:

If (and only if) you are using the latter form, write it out as shown in the correct example to ensure portability.


ShellCheck 0.8.0 and below incorrectly emits this warning for constructs like >& $var, even though this would be POSIX compatible when $var is an integer. In such cases, please ignore this warning.

ShellCheck is a static analysis tool for shell scripts. This page is part of its documentation.