Просто добавьте к прекрасному ответу @ 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).