Влияет ли команда more в Windows только на вывод или на выполнение команды?
Я запускаю сборку программного обеспечения в Visual Studio 2005 на Win XP через командную строку (devenv.exe /rebuild). Я все-таки перебросил его, а потом понял, что не хочу, чтобы он сидел с ребенком, поэтому я больше ушел с Q. Теперь я ничего не вижу в окне CMD. Работает ли команда как обычно, больше просто буферизует и отображает STDOUT, и будет ли она продолжать работать, несмотря на то, что больше было завершено, или эта сборка теперь никогда не завершится?
2 ответа
Интересный вопрос!
Процесс, который вы добавили в БОЛЬШЕ, будет продолжаться до его естественного завершения или до тех пор, пока вы его не убьете. Вот тест, чтобы показать это:
Откройте 2 окна cmd.
В командной строке: ping -n 120 127.0.0.1 | Больше
По приглашению два запустите: список задач | findstr / я пингую
Пинг будет выполняться в течение примерно 120 секунд, но при использовании стандартного окна cmd страница заполнится за меньшее время (измените команду ping соответствующим образом).
Во второй подсказке вы можете показать, что PING продолжает работать независимо от того, убили ли вы БОЛЬШЕ клавишей "Q". Только после полного удаления команды PING с помощью ctrl+C или ожидания полных 50 секунд, ping останавливается.
Да, more
буферы и процесс продолжает выполняться, даже если вы не прокручиваете вывод.
Если вы выходите more
рано, хотя, nonexistent pipe
ошибки появляются при некоторых обстоятельствах. По-видимому, это не влияет на выполнение и, вероятно, связано с используемым методом тестирования.
Мы можем протестировать с помощью простого командного файла:
@echo off
for /l %%a in (1,1,100) do echo %%a
msg * done
По трубопроводу это в more
очевидно, что процесс продолжает выполняться независимо от того, more
прокручивается или нет: мы видим done
сообщение без продвижения more
,
Однако, если мы увеличим время выполнения, как это так, и выйти more
с q
середина команда:
@echo off
for /l %%a in (1,1,10000) do echo %%a
msg * done
Мы получаем много сообщений об ошибках:
The process tried to write to a nonexistent pipe.
Окно сообщения все еще появляется. Повторное тестирование с простой программой на C# или C не повторяет это поведение. Я предполагаю, что если поток уже открыт, он будет работать как обычно (без вывода) - но echo
Команда, использованная в вышеприведенных тестах, на самом деле пытается каждый раз открывать поток заново, и когда канал назначения закрыт, это уже невозможно.