On Sat, Jan 25, 2025 at 8:56 AM Lindsay Lawrence <
[email protected]> wrote:
> Is there a straightforward way from PicoLisp, when executing an external
> process, to get stderr on a separate channel?
> I'd like to do something like (pipe) where I can connect stdin and stdout,
> but have an additional channel for the child's stderr
>
> After a bit of hacking, I've come up with the code below:
It uses pipe, redirects stderr of the Exe to a file and returns a list with
the stdout lines in the car and stderr in the cadr
I'm pretty happy with it :)
/Lindsay
(de runExe (Cmds . Exe)
(use (LOut LErr)
(let (ErrFile (tmp "exerr." (rand)))
(finally (call "rm" ErrFile)
(pipe
(err ErrFile (out Exe (mapc prinl Cmds)))
(setq LOut (make (while (line T) (link @)))) )
(in ErrFile
(setq LErr (make (while (line T) (link @)))) ) ) )
(list LOut LErr) ) )
which works something like this (note the error in the last command sent)
: (mapc '((X) (mapc println X))
(runExe '(".mode quote"
"select strftime('%s', 'now'), date('now');"
"select date();"
"select time();"
"select datetim();"
".exit")
sqlite3 "file:mdb?mode=memory" ))
"'1737836168','2025-01-25'"
"'2025-01-25'"
"'20:16:08'"
"Error: near line 5: no such function: datetim"
-> "Error: near line 5: no such function: datetim"