Чому ці дві команди «котячі» мають результат по-різному?


12

Припустимо, що infile містить певний текст, і я повинен був виконати такий набір команд:

виконувати 3<infile

кіт -н <&3

кіт -н <&3

Перший екземпляр кота відобразить вміст файлу, але, здається, другий раз нічого не робить. Чому вони відрізняються?

Відповіді:


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, анкет open("/dev/fd/3")більш-менш еквівалентний 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.