Example 2: Executing UNIX commands

Read the output of a command

This program executes the ls command, read from the standard output stream of the command, to display the file names and extensions separately.

The second parameter of the openPipe() method is "r", only to read from the standard output of the command:

MAIN
  DEFINE fn, ex STRING
  DEFINE ch base.Channel
  LET ch = base.Channel.create()
  CALL ch.setDelimiter(".")
  CALL ch.openPipe("ls -1","r") -- Warning: ls option is -1 (digit one)
  WHILE ch.read([fn,ex])
    DISPLAY "Filename: ",fn, COLUMN 40,
            "ext: ",NVL(ex,"NONE")
  END WHILE
  CALL ch.close()
END MAIN

Write and read from a command

The next program executes the tr command, writing to its standard input stream and reading the standard output stream.

The second parameter of the openPipe() command is "u", to read and write from/to the command. Note that we must force the tr command to flush each line written to stdout, with the stdbuf -oL command:

MAIN
  DEFINE ch base.Channel, x INTEGER
  LET ch = base.Channel.create()
  --CALL ch.openPipe("tee file.tmp","u") -- OK
  --CALL ch.openPipe("tr '[:lower:]' '[:upper:]'","u") -- Hangs in readLine()
  CALL ch.openPipe("stdbuf -oL tr '[:lower:]' '[:upper:]'","u") -- OK
  FOR x=1 TO 3
    CALL ch.writeLine(SFMT("line #%1",x))
    DISPLAY ch.readLine()
  END FOR
  CALL ch.close()
END MAIN