mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
84 lines
1.9 KiB
V
84 lines
1.9 KiB
V
|
module main
|
||
|
|
||
|
import os
|
||
|
|
||
|
// this is a example script to show you stdin can be used and keep a process open
|
||
|
|
||
|
fn exec(cmd string) (string, int) {
|
||
|
mut cmd2 := cmd
|
||
|
mut out := ''
|
||
|
mut line := ''
|
||
|
mut rc := 0
|
||
|
mut p := os.new_process('/bin/bash')
|
||
|
|
||
|
// there are methods missing to know if stderr/stdout has data as such its better to redirect bot on same FD
|
||
|
// not so nice trick to run bash in bash and redirect stderr, maybe someone has a better solution
|
||
|
p.set_args(['-c', 'bash 2>&1'])
|
||
|
p.set_redirect_stdio()
|
||
|
p.run()
|
||
|
|
||
|
if !cmd2.ends_with('\n') {
|
||
|
cmd2 += '\n'
|
||
|
}
|
||
|
|
||
|
p.stdin_write(cmd2)
|
||
|
p.stdin_write('\necho **OK**\n')
|
||
|
|
||
|
for {
|
||
|
if !p.is_alive() {
|
||
|
break
|
||
|
}
|
||
|
line = p.stdout_read()
|
||
|
println(line)
|
||
|
// line_err = p.stderr_read() //IF WE CALL STDERR_READ will block
|
||
|
// we need a mechanism which allows us to check if stderr/stdout has data or it should never block
|
||
|
// is not a good way, need to use a string buffer, is slow like this
|
||
|
out += line
|
||
|
if out.ends_with('**OK**\n') {
|
||
|
out = out[0..(out.len - 7)]
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// println("read from stdout, should not block")
|
||
|
// is not really needed but good test to see behaviour
|
||
|
// out += p.stdout_read()
|
||
|
// println("read done")
|
||
|
|
||
|
// println(cmd.stderr_read())
|
||
|
|
||
|
if p.code > 0 {
|
||
|
rc = 1
|
||
|
println('ERROR:')
|
||
|
println(cmd2)
|
||
|
print(out)
|
||
|
}
|
||
|
// documentation says we need to call p.wait(), but this does not seem to work, will be process stop or become zombie?
|
||
|
// p.wait()
|
||
|
|
||
|
return out, rc
|
||
|
}
|
||
|
|
||
|
fn main() {
|
||
|
mut out := ''
|
||
|
mut rc := 0
|
||
|
|
||
|
// the following does not work, not sure why not
|
||
|
// out,rc = exec("find /tmp/ && echo '******'")
|
||
|
|
||
|
out, rc = exec("find /tmp/ ; echo '******'")
|
||
|
println(out)
|
||
|
assert out.ends_with('******\n')
|
||
|
|
||
|
out, rc = exec('echo to stdout')
|
||
|
assert out.contains('to stdout')
|
||
|
|
||
|
out, rc = exec('echo to stderr 1>&2')
|
||
|
assert out.contains('to stderr')
|
||
|
|
||
|
out, rc = exec('ls /sssss')
|
||
|
assert rc > 0 // THIS STILL GIVES AN ERROR !
|
||
|
|
||
|
println('test ok stderr & stdout is indeed redirected')
|
||
|
}
|