Мой вопрос касается роли канала в пакетных сценариях Windows (CMD).
В соответствии с моим текущим пониманием, которое может быть ошибочным, конвейерные команды выполняются последовательно, и стандартный вывод предыдущей команды (если есть) используется для стандартного ввода следующей команды.
Если предыдущая команда не выдает никаких выходных данных (потому что она вышла с ненулевым уровнем ошибки или потому что она вообще не должна вырабатывать никаких выходных данных), то в следующую команду ничего не передается,и он ведет себя соответственно в зависимости от того, нуждается ли он или не нуждается ни в каком входе, чтобы работать должным образом.
Если последующая команда не требует какого-либо стандартного ввода (например, DIR
), но предыдущая команда пропускает некоторые, то я ожидаю, что она будет проигнорирована.Например, в:
DIR | DIR
вывод первого DIR
передается второму, который в этом не нуждается.Таким образом, второй DIR
просто игнорирует ввод и выполняет то, что он должен делать, то есть печатает содержимое текущей папки в консоли.
Но если я попытаюсь:
DIR | SET x=5
, тогда переменной x
не будет присвоено ничего, почему?Команде SET
не требуется никакого ввода для выполнения своей работы.Так почему же он не просто игнорирует ввод от DIR
и занимается своими делами?
Мои вопросы:
- Правильно ли я понимаю логику канала?
- если да, почему мы наблюдаем это поведение для
SET
?
Если возможно, помимо ответа, просьба также предоставить ссылку на источник, где такие темы подробно обсуждаются.Спасибо!