Run a program with OSProcess

From Cuis CookBook
Jump to navigation Jump to search

All the sinppets in this page require you to run

Feature require: 'OSProcess'.

Simple. Run a command and wait, only for the output

  • sync
  • Main issue. no exit code.

Example. ---- NO - move it out from here, requires CommandShell

out _ OSProcess outputOf: 'pwd'. 
out class.                       "=> String "
out withBlanksTrimmed.           "=> '/home/p/prog/cuis-project' "

Simple. Run a command and wait, only to get the exit code

  • sync
  • Main issue. not frequently useful.

Example

out _ OSProcess waitForCommand: ' sh -c "exit 33" '. 
out class.                        "=> ExternalUnixOSProcess "
out exitCode .                    "=> 33 .   NOTE. exitCode was added on 16-oct-2021."

Run a command to get the output, no input, sync

Example. Get the current date using Linux date command.

d _ Delay forMilliseconds: 50.
in _ nil.
out _ '/tmp/test.out' asFileEntry forceWriteStream .
err _  '/tmp/test.err' asFileEntry forceWriteStream .
proc _ UnixProcess forkJob: '/usr/bin/date' 
                              arguments: nil environment: nil 
                   descriptors: {in. out. err.}.
[proc runState == #complete] whileFalse: [d wait].                
proc pid.
oExit _ proc     exitCode .         
oOut _ out contents. 
oErr _ err contents.             
{in. out. err} do: [ :f | f ifNotNil: [ f close ] ].
'exitCode: {1}, output: {2}' format: {oExit. oOut withBlanksTrimmed .}

"=> 'exitCode: 0, output: Tue 14 Sep 16:23:10 CEST 2021' "

Run a command through the shell to get the output, no input, sync

Example. Get the first 3 lines of output of ls in the current directory. That is run in bash the

command ls -l | head -n 3.

d _ Delay forMilliseconds: 50.
in _ nil.
out _ '/tmp/test.out' asFileEntry forceWriteStream .
err _  '/tmp/test.err' asFileEntry forceWriteStream .
proc _ UnixProcess forkJob: '/usr/bin/bash' 
                              arguments: {'-c'. 'ls -l | head -n 3'} 
                          environment: nil 
                   descriptors: {in. out. err.}.
[proc runState == #complete] whileFalse: [d wait].                
proc pid.
oExit _ proc     exitCode .         
oOut _ out contents. 
oErr _ err contents.             
{in. out. err} do: [ :f | f ifNotNil: [ f close ] ].
'exitCode: %d\noutput: %s' printf: {oExit. oOut withBlanksTrimmed } .  
"=> 'exitCode: 0
output: total 3808
drwxrwx---  3 p p    4096 Aug 18 12:54 AMQP
drwxrwx---  3 p p    4096 Aug 18 12:54 Cairo' "

As before, but pass input through stdin

Example. We are going to count the number of charaters of what is sent through stdin via wc -c.

d _ Delay forMilliseconds: 50.
'/tmp/test.in' asFileEntry fileContents: 'Hello World!'.
in _ '/tmp/test.in' asFileEntry readStream .
out _ '/tmp/test.out' asFileEntry forceWriteStream .
err _  '/tmp/test.err' asFileEntry forceWriteStream .
proc _ UnixProcess forkJob: '/usr/bin/bash' 
                              arguments: {'-c'. 'wc -c'} 
                          environment: nil 
                   descriptors: {in. out. err.}.
[proc runState == #complete] whileFalse: [d wait].                
proc pid.
oExit _ proc     exitCode .         
oOut _ out contents. 
oErr _ err contents.             
{in. out. err} do: [ :f | f ifNotNil: [ f close ] ].
'exitCode: %d\noutput: %s' printf: {oExit. oOut withBlanksTrimmed } .  

"=> 'exitCode: 0
output: 12' "