|
function execute(command) local lines = {} local file = io.popen(command) for line in file:lines() do table.insert(lines, line) end file:close() return lines end
Unfortunately, when you're combining popen with a lines iterator it's easy to become a victim of the infamous "broken pipe" phenomenon. Here's why:
There's a suble difference between calling the lines iterator and reading a line using file:read "*l". Both try to fetch the next line and will check for file errors. However, the iterator will *throw an alert* if it sees an error, while the regular read method simply returns nil (plus extra values to indicate what went wrong).
On my cheapo Windows XP machine the lines-driven for-loop (as shown above) always comes to a screeching halt. Using a loop around a read "*l" call may look less elegant, but works just fine. Obviously, in the latter case the broken pipe situation is still there. It just doesn't bring the script to its knees, because no alert is thrown.
I've only tested this using the Lua 5.2 beta and did not try Lua 5.1. But it looks like a similar error throwing logic is in place there. So, keep that in mind.
Ashwin.