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).

Dave

_______________________________________________
Beginners mailing list
Beginners@lists.squeakfoundation.org
http://lists.squeakfoundation.org/mailman/listinfo/beginners

Reply via email to