Используйте stderr в lua io.popen, чтобы определить ошибочный вызов функции

Я делаю функцию, которая может читать метаданные текущей песни, воспроизводимой в Spotify. Это программируется на lua, так как это реализация для awesome wm. Я получил следующую строку, чтобы получить все метаданные, которые я могу использовать позже.

handle = io.popen('qdbus org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Metadata | awk -F: \'{$1=\"\";$2=\"\";print substr($0,4)}\'') 

Однако, когда Spotify не работает, я не получаю ожидаемую информацию, и qdbus записывает ошибку в поток stderr. Я хотел использовать тот факт, что qdbus пишет в поток ошибок, чтобы определить неисправность и остановить там программу. (Это также должно обнаруживать любые другие ошибки, не связанные с тем, работает ли Spotify или нет)

Насколько я понимаю, lua popen использует popen3, который может делиться на stdout и stderr. но все мои усилия до сих пор бесплодны, и мой поток ошибок всегда пуст. Можно ли проверить ненулевое значение в stderr, чтобы определить ошибочный вызов qdbus (или awk)?

Благодарность!


person Hoogendijk    schedule 05.06.2013    source источник


Ответы (3)


Если вы хотите различать stderr и stdout, вы не можете сделать это с помощью библиотеки io, но можете с помощью luaposix. См., например, этот ответ.

person catwell    schedule 05.06.2013

Я думаю, вы можете перенаправить stderr на stdout в вызове popen следующим образом:

handle = io.popen("somecommand 2>&1")
person Yu Hao    schedule 05.06.2013
comment
не то, что я имел в виду, я на самом деле хочу, чтобы io.popen записывал две разные переменные в зависимости от того, исходят ли они из stderr или stdout. Это просто перенаправит stderr на stdout. Извините, если мой вопрос не был яснее - person Hoogendijk; 05.06.2013
comment
@Hoogendijk В таком случае я не думаю, что popen может выполнить эту работу. Так как это реализовано с fork и pipe в C (я не подтверждал это). - person Yu Hao; 05.06.2013

Вы можете проверить juci.exec, который я написал для веб-интерфейса JUCI. Я боролся с той же проблемой, и в итоге я использовал luaposix для таких вещей, когда мне действительно нужны два отдельных потока. Моя реализация также дает вам код выхода программы, который удобен для проверки на наличие ошибок: https://github.com/mkschreder/juci/blob/master/juci/lua/core.lua

person user2826084    schedule 25.10.2015