使用lua io.popen的stderr来确定错误的函数调用。

我正在编写一个函数,可以读取在 Spotify 中播放的当前歌曲的元数据。由于这是 awesome wm 的实现,因此它是用 lua 编程的。我得到了以下代码行,以获取所有元数据,以后可以使用。

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 使用可以将 stdout 和 stderr 分开的 popen3。但迄今为止,我的所有努力都是徒劳的,错误流始终为空。是否可以检查 stderr 中的非空值,以确定对 qdbus(或 awk)的调用失败?

谢谢!

点赞
用户1009479
用户1009479

我认为你可以通过调用 popen 并将 stderr 重定向到 stdout 来实现,代码如下:

handle = io.popen("somecommand 2>&1")
2013-06-05 01:55:08
用户204011
用户204011

如果想要区分 stderrstdout,则不能使用 io 库,但是可以使用 luaposix。例如,请参见 此回答

2013-06-05 08:17:12
用户2826084
用户2826084

你可以查看我为JUCI webgui编写的juci.exec。我曾经也面临同样的问题,最终我使用了luaposix来处理这种需要两个分离流的情况。我的实现还可以给你程序的退出码,这对于测试错误很有帮助:https://github.com/mkschreder/juci/blob/master/juci/lua/core.lua

2015-10-25 12:33:39