Просто добавьте к прекрасному ответу @ jw013, это может помочь понять, что это так же, как
{
cat -n
cat -n
} < infile
< fileсокращенно 0< file, то есть использовать дескриптор файла 0 вместо 3.
И, чтобы немного запутать дело, эта версия:
exec 3< infile
cat -n /dev/fd/3
cat -n /dev/fd/3
Веду себя по- разному в зависимости от используемого вами ОС в и типе из infile(обычного файла против трубы против устройства ...)
В Solaris и большинстве коммерческих Unices a open("/dev/fd/3")более или менее эквивалентно a dup(3)( < /dev/fd/3примерно так же, как <&3), в то время как в Linux для обычных файлов /dev/fd/3реализована символическая ссылка на исходный файл, поэтому open("/dev/fd/3")он открывается заново с самого начала ( и, возможно, с другими флагами из FD 3).