Определение

В Unix с каждым процессом связана таблица дескрипторов.

Это просто список, который удерживает информацию о всех открытых файлах и потоках данных.

Каждый файл или поток, с которым работает процесс, имеет уникальный номер в этой таблице, называемый дескриптором файла.

Например, стандартный ввод, вывод и вывод ошибок имеют дескрипторы 0, 1 и 2 соответственно.

Операционной системе и самому процессу позволено управлять доступом к файлам и потокам данынм процесса через эту таблицу.

aa

Перенаправления в общем виде

ПеренаправлениеОписание
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. Начальное состояние

diagram

Шаг 1: 3>&2

diagram

теперь дескриптор 3 “смотрит” туда же, куда был направлен 2 дескриптор

Шаг 2: 2>&1

diagram теперь дескриптор 2 “смотрит” туда же, куда был направлен 1 дескриптор

Шаг 3: 1>&3

diagram направили дескриптор 1 туда же, куда был направлен 3 дескриптор

Шаг 4: 3>&-

diagram закрыли дескриптор 3

Таким образом, конструкция

ls 3>&2 2>&1 1>&3 3>&-

запустит ls, поменяв потоки 1 и 2 местами:

  1. Откроется поток 3, который будет писать в y.
  2. Поток 2 переоткрывается и будет писать в x.
  3. Поток 1 переоткрывается и и будет писать в y.
  4. Поток 3 закрывается.