[Newbies] PipeableOSProcess shell interaction
David T. Lewis
lewis at mail.msen.com
Wed Jun 12 12:47:50 UTC 2013
On Tue, Jun 11, 2013 at 10:34:47PM -0700, Sean P. DeNigris wrote:
> When using PipeableOSProcess as a shell, how can I get feedback on the status
> of the individual commands?
> For example, with waitForCommand:, I can do:
> p := PipeableOSProcess waitForCommand: 'curl -L largeFile'.
> p succeeded ifFalse: [ ^ self error: 'Could not dowload...' ].
> but a the shell like:
> shell := PipeableOSProcess bash.
> shell exec: ('cd ', folderName).
> shell exec: 'curl -L largeFile...'.
> what's the equivalent of #succeeded? If there's no clear external sign that
> the command is finished, how do I check? Also, I don't seem to get anything
> back on the error stream e.g. if I change curl to cul, which doesn't exist,
> I still get an empty string from #errorUpToEnd.
When you run a Unix shell (bash) in a pipeable proxy, you can talk to the
shell by reading and writing to the proxy. A Unix shell keeps track of the
exit status of the last program that it ran in a shell variable ($?), so
you can ask the shell for that exit status.
This should give you a few ideas:
shell := PipeableOSProcess bash. "Run a bash shell in a pipeable proxy"
shell pipeFromOutput reader setNonBlocking. "Do not block the VM on reads"
shell exec: 'cd ..'. "Write a command to shell input with a line terminator"
shell exec: 'ls'. "Write another command to bash"
(Delay forMilliseconds: 200) wait. "Wait for output to arrive"
shell upToEnd inspect. "Read from bash shell output"
shell exec: 'echo $?'. "Ask bash shell for exit status of the last command".
(Delay forMilliseconds: 100) wait.
shell upToEnd inspect.
shell close. "Do not leave open file handles from pipes"
PipeableOSProcess is designed to be part of CommandShell, so when you use it
directly (rather than using a CommandShell), you need to take care of a few
details. The important things are to set the output pipe for nonblocking reads
(otherwise you will hang up your VM on a read), and to close pipes when you
are done using them (otherwise you will "leak" file handles over time).
More information about the Beginners