2014-01-29 2 views
0

Я запускаю скрипт python, который производит определенный вывод, когда я запускаю его в подробном режиме. Когда я подключаю вывод к меньшей утилите, выход находится в другом порядке. Для справки, сценарий, если не совсем, почти так:Почему меньше изменяется порядок вывода?

http://svn.apache.org/repos/asf/subversion/trunk/tools/client-side/change-svn-wc-format.py

В частности, я получаю «данные для следующего поля (ов)» сообщение, и когда я запускаю его без перенаправив вывод меньше, это сообщение появляется последним. Когда я делаю вывод на меньшее, вывод таинственным образом появляется первым.

Может ли кто-нибудь объяснить это?

Я установил, что сообщение об ошибке отправляется в stderr, в то время как подробные сообщения отправляются в стандартный вывод. Тем не менее, даже когда я это делаю:

./svnfixversion ./ 1.5 --verbose 2>&1 | less 

выход отличается от того, когда я просто оставляю | Меньше. Если stderr перенаправляется на stdout, не менее важно сохранить заказ?

+1

'less' сохраняет заказ, который он получает; однако нет никакой гарантии, что оболочка чередует стандартную ошибку и стандартный вывод при записи в трубу в первую очередь. – chepner

ответ

3

При запуске:

./svnfixversion ./ 1.5 --verbose 

stdout его построчно буферный, stderr является небуферизованным.

В:

./svnfixversion ./ 1.5 --verbose 2>&1 | less 

stdout его полностью буферизацией, stderr не является буфером.

Режим буферизации ./svnfixversionFILE* stdout - это то, что делает выходным в этих двух случаях.

Если вы хотите, чтобы второй выход будет идентичен первому, установите stdout режим буферизации, чтобы выровнять с буфером stdbuf применения:

stdbuf --output=L ./svnfixversion ./ 1.5 --verbose 2>&1 | less 

В современной bash вы можете заменить 2>&1 | с более короткими |&.


Что происходит под капотом, является то, что при запуске программы перед тем main() называется glibcisatty(STDOUT_FILENO) вызовов, чтобы определить, является ли stdout подключен к терминалу. Если это так, stdout - это строка буферизации, в противном случае полная буферизация. stderr всегда не загружен.

+0

Я знал, что stderr не имеет буферизации, но я никогда не слышал о буферизации строк и полностью буферизации ... спасибо! –

Смежные вопросы