В предыдущей статье мы выяснили, что операторы перенаправления ввода-вывода используются для изменения местоположения потоков ввода или вывода команд, заданных по умолчанию. Местоположение потока называется дескриптором.
Каждому открытому файлу или устройству соответствует дескриптор, представляющий собой неотрицательное число, значение которого используется процессом, породившим поток ввода-вывода.
Всего зарезервировано 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
Сообщение об ошибке перестало попадать в окно командой строки.
Иногда может потребоваться изменение источников и приемников данных в стандартных потоках ввода-вывода. Для этого используется процедура перенаправления дескрипторов.
Перенаправление дескрипторов
Для указания перенаправления на другой дескриптор, используется знак амперсанд (&), за которым следует номер принимающего дескриптора:
>& - данные на выходе левого дескриптора становятся входными данными для правого дескриптора.
<& - входные данные левого дескриптора становятся данными на выходе правого дескриптора.
Обратимся в предыдущему примеру:
del c:\secret.txt > nul
del c:\secret.txt 2> nul
В первом случае при отправке вывода (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), а затем наоборот:
В любом случае произойдет совместный вывод содержимого обоих дескрипторов.
На этом цикл статей по основам работы в командной строке завершается. Изложенного материала достаточно для перехода к прикладному использованию командной строки.
В следующих статьях будет подробно разбираться инструментарий командной строки для решения повседневных задач системного администратора.
Поэтому подписывайтесь на канал и следите за новинками!