Определение
В Unix с каждым процессом связана таблица дескрипторов.
Это просто список, который удерживает информацию о всех открытых файлах и потоках данных.
Каждый файл или поток, с которым работает процесс, имеет уникальный номер в этой таблице, называемый дескриптором файла.
Например, стандартный ввод, вывод и вывод ошибок имеют дескрипторы 0, 1 и 2 соответственно.
Операционной системе и самому процессу позволено управлять доступом к файлам и потокам данынм процесса через эту таблицу.
Перенаправления в общем виде
Перенаправление | Описание |
---|---|
x>y | Перенаправляет вывод из x в файл y , перезаписывая его. |
x>>y | Перенаправляет вывод из x в файл y , вывод будет добавляться в конец файла без перезаписи. |
x<y | Считывает ввод для x из файла y . |
x>&y | Перенаправляет вывод из x туда же, куда направлен файловый дескриптор y . |
x<&y | Перенаправляет ввод для x из того же места, с которым связан на чтение файловый дескриптор y . |
x>&- | Закрывает файловый дескриптор x для вывода. |
x<&- | Закрывает файловый дескриптор x для ввода. |
Пример с ls
Ниже представлено состояние таблицы дескрипторов при запуске такой команды:
ls 3>&2 2>&1 1>&3 3>&-
Если изначально открыты потоки 1 (на запись в x) и 2 (на запись в y), а поток 3 закрыт, то
Шаг 0. Начальное состояние
Шаг 1: 3>&2
теперь дескриптор 3 “смотрит” туда же, куда был направлен 2 дескриптор
Шаг 2: 2>&1
теперь дескриптор 2 “смотрит” туда же, куда был направлен 1 дескриптор
Шаг 3: 1>&3
направили дескриптор 1 туда же, куда был направлен 3 дескриптор
Шаг 4: 3>&-
закрыли дескриптор 3
Таким образом, конструкция
ls 3>&2 2>&1 1>&3 3>&-
запустит ls, поменяв потоки 1 и 2 местами:
- Откроется поток 3, который будет писать в
y
. - Поток 2 переоткрывается и будет писать в
x
. - Поток 1 переоткрывается и и будет писать в
y
. - Поток 3 закрывается.