Почему эти две команды 'cat' имеют разные результаты?


12

Давайте предположим, что infile содержит определенный текст, и я должен был выполнить следующий набор команд:

Exec 3<infile

кот-н <&3

кот-н <&3

Первый экземпляр cat отобразит содержимое файла, но второй раз, похоже, ничего не делает. Почему они отличаются?

Ответы:


29

Они выглядят как одна и та же команда, но причина, по которой они отличаются, состоит в том, что состояние системы изменилось в результате первой команды. В частности, первый catиспользует весь файл, так что второму catнечего читать, он сразу нажимает EOF (конец файла) и завершает работу.

Причиной этого является то, что вы используете одно и то же описание файла (которое вы создали exec < infileи присвоили дескриптору файла 3) для обоих вызовов cat. Одной из вещей, связанных с описанием открытого файла, является смещение файла. Итак, первый catчитает весь файл, оставляет смещение в конце, а второй пытается взять его с конца файла и не находит ничего для чтения.


12

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.