Shell Access

lua-users home
wiki

Difference (from prior minor revision) (major diff, author diff)

Changed: 7c7
This reads output from a process via a pipe. There is a way to make this work on Windows too (see PipesOnWindows).
This reads output from a process via a pipe. There is a way to make this work on Windows too (see PipesOnWindows, not needed for Lua 5.1.2, see below).

The following examples relate to allowing Lua to interact with the shell, such as for shell scripting.

[!] VersionNotice: The below code pertains to an older Lua version, Lua 4. Some of it does not run as is under Lua 5.

Piping from command

This reads output from a process via a pipe. There is a way to make this work on Windows too (see PipesOnWindows, not needed for Lua 5.1.2, see below).

-- Perform a shell command and return its output
--   c: command
-- returns
--   o: output
function shell(c)
  local input = _INPUT
  local o, h
  h = readfrom("|" .. c)
  o = read("*a")
  closefile(h)
  _INPUT = input
  return o
end

On lua5.0.2 I think it should be something like:

function shell(c)
  local o, h
  h = assert(io.popen(c,"r"))
  o = h:read("*all")
  h:close()
  return o
end

Lua 5.1.2: io.popen runs fine under Windows XP "out-of-the-box", even from within a non-DOS application --AndreasRozek

Process files in command-line arguments

A typical thing to want to do in a command-line utility is to process each file given on the command line. Here's a function to encapsulate this process:

-- Process all the files specified on the command-line with function f
--   name: the name of the file being read
--   i: the number of the argument
function processFiles(f)
  for i = 1, getn(arg) do
    if arg[i] == "-" then readfrom()
    else readfrom(arg[i])
    end
    file = arg[i]
    f(arg[i], i)
    readfrom() -- close file, if not already closed
  end
end

RecentChanges · preferences
edit · history
Last edited April 17, 2007 4:26 pm GMT (diff)