- Up - |
Suppose, we want to start and control a Unix Bourne shell sh
(see sh(n)
) by an Oz program. We first have to start a Unix process running the shell and then we need a connection to this shell to send commands to it and receive its output.
This can be done with class Open.pipe
. Program Program 6.1 shows the definition of a shell class.
class Shell from Open.pipe Open.text
meth init
Open.pipe,init(cmd:"sh" args:["-s"])
end
meth cmd(Cmd)
Open.text,putS(Cmd)
end
meth show
case Open.text,getS($) of false then
{Browse 'Shell has died.'} {self close}
elseof S then {Browse S}
end
end
end
Creating a shell object by
S={New Shell init}
the command sh
is executed in a newly created process. The command sh
gets the argument -s
to signal that the shell should read from standard input. The forked process is connected by its standard input and standard output to the created Shell
object.
By inheriting from the class Open.text
we can simply send text to the running sh
process by using the putS
method, and receive lines of text by using the getS
method.
If we want to see the files in our home directory, we will first navigate to it by cd(1)
, and then issue the ls(1)
command:
{S cmd(cd)}
{S cmd(ls)}
Now we can incrementally request the names of the files by
{S show}
and they will appear in the Browser window.
Closing the object and the shell is done simply by
{S close}
- Up - |