io.popen():lines() 忽略第一个非空行。

我有一个 shell 脚本输出,像这样:

1
Space Cruise (Title)
Ben Prunty Music
FTL
46.4

现在我想将这些行映射到一个数组中,像这样:

mymplayer = { track="", title="", artist="", album="", time="" }

因此我正在使用 io.popen() 进行测试,像这样:

function get_data()
    local fh = io.popen("bin/mplayerout.sh")
    for l in fh:lines() do print(l) end
end

问题在于,这有以下输出:

Space Cruise (Title)
Ben Prunty Music
FTL
46.4

现在,如果我让我的脚本输出从一个新行开始,输出就像这样:

<empty line>
Space Cruise (Title)
Ben Prunty Music
FTL
46.4

我做错了什么?

点赞
用户12048
用户12048

可能是因为 mplayerout.sh 的输出的第一行以回车符( "\r") 结尾,而其它行以换行符( "\n""\r\n")结尾。

因此,初始的“1”仍然会出现在输出中,但是 "\r" 会导致终端将其覆盖为以下字符。

您可以使用 print(string.format("%q", l)) 进行查看。如果第一行嵌入了 "\r",输出将为:

"1\rSpace Cruise (Title)"
"Ben Prunty Music"
"FTL"
"46.4"
2013-11-09 14:32:32
用户2192641
用户2192641

好的,我找到了问题所在。在 Python 中执行相同的操作时,我得到了第一行 - 但是它是由3281个空字节( '\x00')后跟 '\x02\n' 组成的。

看起来问题是在脚本中...

2013-11-09 14:57:47