2014-02-09 5 views
2

Я пытаюсь захватить как потоки вывода в переменную, используя следующий код:Bash - STDERR захвачены перед тем стандартный вывод

FileIDs="$(plutil -key "ID" file1.plist file2.plist file3.plist file4.plist 2>&1)" 

Однако, когда я эхо содержимое, сохраненное в переменной, любые STDERR линии показывают сначала, затем строки stdout.

Error: File not found at path file3.plist 
File1ID 
File2ID 
File4ID 

Если plutil -key "ID" file1.plist file2.plist file3.plist file4.plist 2>&1 выполняется на терминале вывод распечатывается, как и ожидалось:

File1ID 
File2ID 
Error: File not found at path file3.plist 
File4ID 

Что я могу сделать, чтобы захватить как потоки вывода в правильном порядке?

+0

Какая платформа, какие версии 'plutil' и' bash'? – mklement0

+0

@ mklement0 iOS, 'plutil', написанный Эрикой Садун в пакете Utilities Erica. – Dan

ответ

5

Вы не должны полагаться на заказ stdout и stderr. Это два отдельных потока, и их следует рассматривать как таковые.

Тем не менее, разница, которую вы видите, вероятно, является следствием буферизации stdlib, когда вывод не является tty. Если вы на системе GNU, вы можете попробовать

cmd=$(stdbuf -o 0 -e 0 plutil -key "ID" file1.plist file2.plist file3.plist file4.plist 2>&1) 

на других системах, попробуйте unbuffer команду, установленную в рамках expect.

Это предотвратит буферизацию и, надеюсь, будет чередовать потоки в том порядке, в котором вы надеетесь.

+0

К сожалению, ни одна из этих команд не доступна в моей системе, но спасибо за объяснение, почему эта проблема возникает. – Dan

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