Найти тему

Windows 10. Использование дескрипторов в командной строке

В предыдущей статье мы выяснили, что операторы перенаправления ввода-вывода используются для изменения местоположения потоков ввода или вывода команд, заданных по умолчанию. Местоположение потока называется дескриптором.

Каждому открытому файлу или устройству соответствует дескриптор, представляющий собой неотрицательное число, значение которого используется процессом, породившим поток ввода-вывода.

Всего зарезервировано 10 дескрипторов:

0 – ввод с клавиатуры (STDIN).

1 - вывод в окно командной строки (STDOUT).

2 – вывод ошибок в окно командной строки (STDERR).

с 3 по 9 – индивидуальные дескрипторы прикладных программ.

Чтобы воспользоваться определенным дескриптором, необходимо ввести его номер перед оператором перенаправления "<" или ">", указав тем самым, откуда считывать или куда записывать данные.

Если дескриптор не определен, по умолчанию:

< - оператор перенаправления ввода - дескриптор 0.

> - оператор перенаправления вывода - дескриптор 1.

Убедимся в этом, выполнив команды записи и чтения без указания и с указанием первых двух дескрипторов:

echo ping ya.ru > c:\ping.txt

Запись в файл без указания дескриптора
Запись в файл без указания дескриптора

echo ping ya.ru 1> c:\ping.txt

Запись в файл без с указанием дескриптора
Запись в файл без с указанием дескриптора

cmd < c:\ping.txt

cmd 0< c:\ping.txt

Чтение из файла без указания и с указанием дескриптора
Чтение из файла без указания и с указанием дескриптора

Результаты выполнения окажутся идентичными.

Чтобы проверить работу дескриптора вывода сообщений об ошибках (2), попытаемся удалить файл, не имея на то соответствующих разрешений:

del c:\secret.txt

Вывод сообщения об ошибке при попытке удаления файла
Вывод сообщения об ошибке при попытке удаления файла

Затем перенаправим сообщение об ошибке "Отказано в доступе" на фиктивное устройство nul:

del c:\secret.txt 2> nul

Перенаправление сообщения об ошибке на устройство nul
Перенаправление сообщения об ошибке на устройство nul

Сообщение об ошибке перестало попадать в окно командой строки.

Иногда может потребоваться изменение источников и приемников данных в стандартных потоках ввода-вывода. Для этого используется процедура перенаправления дескрипторов.

Перенаправление дескрипторов

Для указания перенаправления на другой дескриптор, используется знак амперсанд (&), за которым следует номер принимающего дескриптора:

>& - данные на выходе левого дескриптора становятся входными данными для правого дескриптора.

<& - входные данные левого дескриптора становятся данными на выходе правого дескриптора.

Обратимся в предыдущему примеру:

del c:\secret.txt > nul

del c:\secret.txt 2> nul

Вывод потоков (2) и (1)
Вывод потоков (2) и (1)

В первом случае при отправке вывода (1) в устройство nul, остается только вывод сообщения об ошибке (2). В обратном случает - вывод (1).

При перенаправлении потока вывода сообщений об ошибках (2) в поток вывода (1), который направляется на устройство nul, или наоборот:

del c:\secret.txt > nul 2>&1

del c:\secret.txt 2> nul 1>&2

Перенаправление дескрипторов на вход
Перенаправление дескрипторов на вход

Данные на выходе из обоих дескрипторов попадут в nul.

Попробуем считать поток вывода (1), перенаправив его в дескриптор вывода сообщений об ошибках (2), а затем наоборот:

Перенаправление дескрипторов на вход
Перенаправление дескрипторов на вход

В любом случае произойдет совместный вывод содержимого обоих дескрипторов.

На этом цикл статей по основам работы в командной строке завершается. Изложенного материала достаточно для перехода к прикладному использованию командной строки.

В следующих статьях будет подробно разбираться инструментарий командной строки для решения повседневных задач системного администратора.

Поэтому подписывайтесь на канал и следите за новинками!