Page 1 of 1

capture cli output

Posted: Fri Mar 31, 2017 2:05 pm
by emeck
Hello,

I want to run a cli program from a Hollywood app, and to capture any output from the ran cli program. What I'm doing now is use a temporary file in T:, like this this:

Code: Select all

Local today$

Execute("date > T:today")

todayfile=OpenFile(Nil, "T:today")
today$=ReadLine(todayfile)
CloseFile(todayfile)
DeleteFile("T:today")

moai.Set("second", "text", today$)  ;send the output to the status bar
Ithis the best way or can I capture cli output without the temporary file?

Re: capture cli output

Posted: Sat Apr 01, 2017 3:47 pm
by airsoftsoftwair
No, I think what you're doing is the best way to capture CLI output with Hollywood.

Re: capture cli output

Posted: Mon Apr 10, 2017 9:40 am
by lazi
There is a way to avoid temp files.
However it has a problem if the executed command does not send anything to the named pipe:

Code: Select all

Execute("date >pipe:day")

todayfile=OpenFile(Nil, "pipe:day")
pos,today$=-1,""
While FilePos(todayfile)<>pos
	pos=FilePos(todayfile)
	today$=today$..ReadLine(todayfile)
Wend
CloseFile(todayfile)

NPrint(today$)
WaitLeftMouse           

Re: capture cli output

Posted: Thu Jan 03, 2019 3:57 pm
by jPV
airsoftsoftwair wrote: Sat Apr 01, 2017 3:47 pm No, I think what you're doing is the best way to capture CLI output with Hollywood.
Would it be possible to implement an event handler that would get triggered always when a program started with the Run() command would output something? RunOutput or such... it would be handy when creating GUIs for shell programs.

Re: capture cli output

Posted: Sat Jan 05, 2019 10:27 pm
by airsoftsoftwair
Hmm, maybe ;)

Re: capture cli output

Posted: Sat Jun 08, 2019 9:00 pm
by airsoftsoftwair
Unfortunately, this is technically not possible because it would have to be implemented through pipes but when redirecting a program's output to a pipe, the internal buffering routines won't flush on a line break but only when a certain platform-dependent buffer threshold is exceeded (e.g. 4096 bytes). This makes it impossible to capture the output of console programs in realtime. It's a little sad because that certainly would have been a nice feature but AFAICS there's no way to implement it, except maybe on Linux by using pseudoterminals.

Re: capture cli output

Posted: Wed Jun 12, 2019 4:44 pm
by airsoftsoftwair
Reflecting on it further, I now think that even though stdio buffering might prohibit real-time output capturing, it's still a good idea to have such a feature because most programs will just continually output text to stdout and this of course can be easily captured. There'll only be problems in case an external program pauses outputting text at some point for whatever reason. In that case, not all output might make its way to Hollywood instantly because of stdio buffering. But it will reach Hollywood as soon as the program continues output to stdout. But since most programs don't behave that way, it's probably not much of an issue, so the feature is now implemented:

Code: Select all

- New: Added "RunOutput" event handler; this can be used to capture the output of programs started using
  Run(); note that output will normally not be delivered in real-time because of stdio buffering but
  if the external program continually outputs text it will arrive pretty instantly at your "RunOutput"
  callback; note that due to OS limitations, this is currently unsupported on AmigaOS 3.x; MorphOS
  users require at least MorphOS 3.12
Note that it's not possible to support it on OS 3.x because the queue handler on OS 3.x is pretty much broken. But all the other Amigaoids will work (MorphOS requires 3.12, though).

Re: capture cli output

Posted: Wed Jun 12, 2019 6:05 pm
by jPV
Great work \o/

Re: capture cli output

Posted: Fri Jun 14, 2019 9:12 am
by emeck
Thank you!