Влияет ли команда more в Windows только на вывод или на выполнение команды?

438
Gregg Leventhal

Я запускаю сборку программного обеспечения в Visual Studio 2005 на Win XP через командную строку (devenv.exe / rebuild). Я все-таки перебросил его, а потом понял, что не хочу сидеть с ним, поэтому я больше ушел с Q. Теперь я ничего не вижу в окне CMD. Команда запускается как обычно, и больше просто буферизует и отображает STDOUT, и она будет продолжать выполняться, несмотря на то, что больше будет завершено, или эта сборка теперь никогда не завершится?

3
Я могу сказать, что в этом случае сборка, кажется, завершилась успешно, но все равно было бы интересно услышать некоторые ответы и подробности. Gregg Leventhal 11 лет назад 0

2 ответа на вопрос

2
sahmeepee

Интересный вопрос!

Процесс, который вы добавили в БОЛЕЕ, будет продолжаться до его естественного завершения или до тех пор, пока вы его не убьете. Вот тест, чтобы показать это:

Откройте 2 окна cmd.

В командной строке: ping -n 120 127.0.0.1 | Больше

По приглашению два запустите: список задач | findstr / я пингую

Пинг будет выполняться в течение примерно 120 секунд, но при использовании стандартного окна cmd страница заполнится за меньшее время (измените команду ping соответствующим образом).

Во второй подсказке вы можете показать, что PING продолжает работать независимо от того, убиваете ли вы БОЛЬШЕ клавишей «Q». Только после полного удаления команды PING с помощью ctrl + C или ожидания полных 50 секунд, ping останавливается.

1
Bob

Да, moreбуферы и процесс продолжают выполняться, даже если вы не прокручиваете вывод.

Если выйти moreрано, хотя, nonexistent pipeошибки действительно появляются в некоторых обстоятельствах. По-видимому, это не влияет на выполнение и, вероятно, связано с используемым методом тестирования.


Мы можем протестировать с помощью простого командного файла:

@echo off for /l %%a in (1,1,100) do echo %%a msg * done 

Прибавляя это more, становится очевидным, что процесс продолжает выполняться независимо от того more, прокручивается он или нет: мы видим doneсообщение без продвижения more.

Однако, если мы увеличим время выполнения, как это, и выйдем moreс qmid-command:

@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команда, использованная в приведенных выше тестах, на самом деле пытается каждый раз открывать поток заново и после закрытия пункта назначения канала, который больше не является возможный.

Похожие вопросы