Припустимо, що infile містить певний текст, і я повинен був виконати такий набір команд:
виконувати
3<infileкіт -н
<&3кіт -н
<&3
Перший екземпляр кота відобразить вміст файлу, але, здається, другий раз нічого не робить. Чому вони відрізняються?
Припустимо, що infile містить певний текст, і я повинен був виконати такий набір команд:
виконувати
3<infileкіт -н
<&3кіт -н
<&3
Перший екземпляр кота відобразить вміст файлу, але, здається, другий раз нічого не робить. Чому вони відрізняються?
Відповіді:
Вони схожі на одну і ту ж команду, але причиною їх різниці є те, що стан системи змінився в результаті першої команди. Зокрема, перший catспоживає весь файл, тому другому catне залишається нічого для читання, негайно натискає EOF (кінець файлу) та виходить.
Причиною цього є те, що ви використовуєте точно той самий опис файлу (той, який ви створили exec < infileта призначили дескриптору файлу 3) для обох викликів cat. Однією з речей, пов’язаних із відкритим описом файлу, є зміщення файлів. Отже, перший catчитає весь файл, залишає зміщення в кінці, а другий намагається забрати з кінця файлу і не знаходить нічого для читання.
Просто для додання тонкої відповіді @ 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).