сряда, 14 януари 2009 г.

Пренасочване на вход и изход в UNIX

Всяка команда (всъщност всеки процес) има на разположение три стандартно отворени файла, които може да използва: стандартен вход, стандартен изход и стандартен изход за грешки. И трите файла стандартно са свързани с терминала на потребителя. С всеки отворен файл се свързва файлов дескриптор, който е цяло неотрицателно число и посредством него се идентифицира отворения файл в системните примитиви, изпълнявани от процеса. Файловите дескриптори на стандартните файлове са съответно 0, 1 и 2. Преди да изпълни определена команда shell може да свърже стандартните файлове с нещо различно от терминала и това се нарича пренасочване на вход/изход (Redirection). Синтаксисът за пренасочването е следния:

команда < файл

Пренасочва стандартния вход на командата от файла.

команда > файл

Пренасочва стандартния изход на командата към файла. Ако файлът не съществува, първо се създава, а ако съществува, то старото му съдържание се изтрива.

команда >> файл

Пренасочва стандартния изход на командата към файла. Ако файлът не съществува, първо се създава, а ако съществува се отваря за добавяне.

команда 2> файл
команда 2>> файл

Пренасочва стандартния изход за грешки на командата към файла.
Пренасочване може да се прави за всеки един файлов дескриптор. Общият вид на конструкциите за пренасочване на вход/изход е:

[n]< файл По премълчаване n е 0 и е файлов дескриптор отворен за вход.
[n]> файл, [n]>>файл По премълчаване n е 1 и е файлов дескриптор отворен за изход.
[n]> &m По премълчаване n е 1. Тук n и m са файлови дескриптори за изход и изходите по двата дескриптора се сливат.
За една команда могат да се пренасочват няколко файла, като shell интерпретира пренасочванията отляво надясно.
Преди пренасочването, в думата файл се интерпретират метасимволите: „$”, „~” и тези за имена на файлове (прави се заместване на променливи, аритметично разширение, заместване на „~” и разширение до имена на файлове). Резултатът от разширението става име на файла, но трябва да е една дума, иначе е грешка.

Пример.
Пренасочване на стандартен вход и изход на команди.
ls d1 > d1list
F=d1list
ls d1 > $F
date > logfile
who >> logfile
write student1 <>cc prog.c 2> errorlist
find /home -name core –print > corelist 2> /dev/null
find /home -name core –print > corelist 2>&1

Последният пример показва как могат да се пренасочат стандартния изход и изход за грешки към един и същи файл. Има и по-кратка конструкция за това:
команда &>файл.
Съществува друга форма за пренасочване на входа, която позволява командата и входните данни да се намират на едно място. Нарича се Here documents и има следния вид.

команда << низ

входни данни
. . .
низ
Тук низ е символен низ, който ограничава входните данни и не трябва да се среща в тях. Ако е указано << \низ, то нито един метасимвол в данните не се интерпретира, в противен случай се интерпретират: „$”, „`” и символите за имена на файлове. write student <
Hello from $USER
Happy New Year!
EOI
write student <<\EOI
Hello from $USER # No expansion
EOI

Няма коментари:

Публикуване на коментар