SC3021
Joachim Ansorg edited this page Oct 31, 2022
·
5 revisions
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.txtCorrect code:
mycommand > log.txt 2>&1The following construct is also fine, as it uses an integer file descriptor instead of a filename:
fd=3
mycommand >& $fdRationale:
There are two forms of the >& file descriptor operator:
-
>& integersuch as>& 3is a POSIX compatible synonym for1>&3 -
>& filenamesuch as>& log.txtis a Bash specific synonym for> log.txt 2>&1
If (and only if) you are using the latter form, write it out as shown in the correct example to ensure portability.
Exceptions:
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.
Related resources:
- Shellcheck issue #2520
- Help by adding links to BashFAQ, StackOverflow, man pages, POSIX, etc!