ролики конвейерные купить
Руководство пользователя для GNU Awk
6. Печатный вывод
6.8 Закрытие входных и выходных файлов и конвейеров
Если одно и то же имя файла или той же команды оболочки использовано в getline (см. раздел 5.8 [Явный ввод с getline], стр. 53) более одного раза во время выполнения awk-программы, то файл открывается (или команда исполняется) только в первый раз. В это время первая запись ввода читается из этого файла или команды. В следующий раз, когда тот же файл или команда используются в getline, другая запись читается из них и т.д. Подобно этому, когда файл или команда открывается для вывода, имя файла или команды запоминается и впоследствии awk дописывает информацию в тот же самый файл или команду. Файл или конвейер остаются открытыми до выхода из awk. Из этого следует, что если вы хотите читать тот же самый файл опять с начала или хотите снова запустить ту же команду оболочки (вместо продолжения чтения информации из команды), вы должны предпринять специальные шаги. Именно, вы должны употребить функцию close следующим образом:
close(имя файла) или close(команда)
Аргументом close может быть любое выражение. Его значение должно точно соответствовать цепочке, используемой для открытия файла или запуска команды (включая пробелы и другие дополнительные символы).
Например, если вы открываете конвейер так:
"sort -r names" -- getline foo
то вы должны закрывать его так:
close("sort -r names")
Если такой вызов функции исполняется, то следующая getline из этого файла или команды, или следующий print или printf для этого файла или команды снова откроет этот файл или перезапустит эту команду. По той причине, что выражение, использованное для закрытия файла или конвейера, должно точно соответствовать выражению, использованному при открытии файла или запуске команды, полезно использовать переменную для запоминания имени файла или команды.
Предыдущий пример превратится в
sortcom = "sort -r names" sortcom -- getline foo ...
close(sortcom)
Это поможет избежать трудно обнаруживаемых типографических ошибок в ваших awk-программах. Приведем несколько причин, по которым может понадобиться закрывать выходной файл:
а. Записать в файл и позднее прочесть записанное в той же самой программе awk. Для этого закройте файл после окончания записи в него. Затем вы можете начать чтение из него по getline.
б. Писать во многие файлы последовательно в той же самой awk-программе. Если вы не будете закрывать их, в конце концов вы превысите системный предел на количество открытых файлов в одном процессе. Так что закрывайте каждый файл после окончания записи в него.
в. Осуществить конец команды. Когда вы пере направляете вывод через конвейер, команда чтения конвейера обычно продолжает читать ввод до тех пор, пока конвейер открыт. Часто это значит, что команда не может фактически выполнить свою работу, пока конвейер не будет закрыт. Например, если вы пере направляете вывод в почтовую программу, сообщение фактически не будет послано до закрытия конвейера.
г. Выполнить ту же самую программу во второй раз с теми же аргументами. Это не то же самое, что дать больше входных данных при первом прогоне! Предположим, например, что вы передаете результат по конвейеру в почтовую программу. Если вы выводите несколько строк, перенаправленных в этот конвейер, не закрывая его, создается одно сообщение из нескольких строк. Наоборот, если вы закрываете конвейер после выдачи каждой строки, то каждая строка становится отдельным сообщением.
Операция close возвращает в ответ 0, если успешно завершилась. В противном случае ответ будет не ноль и gawk устанавливает в переменной ERRNO цепочку с описанием ошибки.
Если вы используете больше файлов, чем позволяет открыть система, gawk будет пытаться мультиплексировать доступные открытые файлы среди ваших файлов с данными. Способности gawk в этой области зависят от возможностей вашей операционной системы, и это не всегда сработает. Поэтому для надежности программы и большей переносимости следует всегда закрывать файлы после окончания работы с ними.
Назад | Вперед
Содержание (общее) | Содержание раздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|