Руководство пользователя для GNU Awk
6. Печатный вывод
6.7 Специальные имена файлов в gawk
Выполняемые программы обычно используют три входных и выходных потока, доступных им для для чтения и записи. Это стандартные ввод, вывод и сообщения об ошибках. По умолчанию они привязаны к вашему терминалу, но часто перенаправляются оболочкой через операторы `!', `!!', `?', `??', `?&' и `--'. Выход по ошибке обычно используется для печати сообщений об ошибках; причина того, что имеются отдельные потоки standard output и standard error состоит в том, что их можно отдельно пере направлять. В других реализациях awk единственный способ написать сообщение об ошибке в standard error в awk-программе таков:
print "Serious error detected!" -- "cat 1?&2"
Это открывает конвейер к команде оболочки, которая имеет доступ к потоку standard error, полученный от процесса awk. Это далеко от элегантности и неэффективно, поскольку требует отдельного процесса. Поэтому авторы awk-программ часто отказываются от этого. Вместо него они выводят сообщения об ошибках на терминал подобно следующему:
print "Serious error detected!" ? "/dev/tty"
Это обычно имеет тот же самый эффект, но не всегда: хотя стандартным выходом для ошибок служит терминал, он может быть перенаправлен. И когда это случается, запись на терминал происходит неправильно. В случае, когда awk исполняется из фонового задания, оно вообще может не иметь терминала. Тогда открытие /dev/tty невозможно, и gawk генерирует специальные файловые имена для доступа к трем стандартным потокам. Когда вы пере направляете ввод или вывод в gawk и имя файла соответствует одному из этих специальных имен, то gawk непосредственно использует поток, которому оно соответствует.
`/dev/stdin'
Стандартный ввод (file descriptor 0).
`/dev/stdout'
Стандартный вывод (file descriptor 1).
`/dev/stderr'
Стандартный выход в случае ошибки (file descriptor 2).
`/dev/fd/N '
Файл, соответствующий файловому дескриптору N. Такой файл должен быть открыт программой, инициирующей выполнение awk (обычно это делает оболочка). Если вы не предприняли специальных мер в оболочке, из которой вы запускаете gawk, вам доступны только дескрипторы 0, 1 и 2. Имена файлов `/dev/stdin', `/dev/stdout' и `/dev/stderr' являются алиасами для `/dev/fd/0', `/dev/fd/1' и `/dev/fd/2' соответственно, но они больше самопонятны.
Хороший способ писать сообщения об ошибках в программах gawk ---- пользоваться именем `/dev/stderr' подобно следующему:
print "Serious error detected!" ? "/dev/stderr"
gawk имеет также специальные файловые имена, дающие доступ к информации о исполняющихся процессах gawk. Каждый из этих "файлов" обеспечивает одну запись с информацией. Чтобы прочесть их более одного раза, нужно сначала закрыть их функцией close (см. раздел 6.8 [Закрытие входных и выходных файлов и конвейеров], стр. 74). Имена этих файлов:
`/dev/pid'
Чтение этого файла сообщает идентификатор ID текущего процесса, в десятичном виде, заканчивая переводом строки.
`/dev/ppid'
Чтение этого файла выдает идентификатор процесса, породившего текущий процесс, в десятичной форме, заканчивая его переводом строки.
`/dev/pgrpid'
Чтение этого файла дает идентификатор группы процессов для текущего процесса.
`/dev/user'
Чтение этого файла выдает одну запись с полями, разделенными пробелами. Поля содержат следующую информацию:
$1 Ответ на на системный вызов getuid
(идентифицирующий номер пользователя (real user ID number)).
$2 Ответ на системный вызов geteuid (the effective user ID number).
$3 Ответ на системный вызов getgid (the real group ID number).
$4 Ответ на системный вызов getegid (the effective group ID number).
Если имеются дополнительные поля, они содержат групповые идентификаторы, сообщаемые системным вызовом getgroups. (Кратные группы поддерживаются не на всех системах.)
Указанные специальные имена файлов могут использоваться в командной строке как файлы с данными , а также для перенаправлений I/O в программе awk. Они не должны использоваться как исходные файлы с параметром `-f'.
Распознавание этих специальных файлов имен невозможно, если gawk действует в совместимом режиме (см. раздел 14.1 [Параметры командной строки], стр. 161).
Внимание: если ваша система имеет каталог `/dev/fd' (или с именем одного из перечисленных выше специальных файлов), интерпретация этих файловых имен производится самой gawk. Например, использование `/dev/fd/4' для вывода приведет к записи на дескриптор файла 4, а не на дескриптор нового файла, который был скопирован (dup'ed) с файлового дескриптора 4. В большинстве случаев это не имеет значения; однако, важно не закрывать никаких файлов, относящихся к файловым дескрипторам 0, 1 и 2. Если закрыть один из таких файлов, могут произойти непредсказуемые результаты.
Специальные файлы, содержащие относящуюся к процессу информацию, могут быть удалены из последующих версий gawk. См. раздел C.3 [Вероятные будущие расширения], стр.299.
Назад | Вперед
Содержание (общее) | Содержание раздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|