www.digitalmars.com         C & C++   DMDScript  

D - Q: execute system command and grab output?

reply Ant <Ant_member pathlink.com> writes:
How can we execute a system command from D
and grab the output ?

I guess executing it on a separate thread should be trivial,
(if not can you throw that in also? :)

(I've seen:

  extern(C) int system(char*);
  int main()
  {
      system("some_program");
      return 0;
  }

  // system is <stdlib.h>
  // exec.. is <unistd.h> is it preferred on unix?
)

Thanks

Ant
Oct 10 2003
parent reply "Charles Sanders" <sanders-consulting comcast.net> writes:
You can use popen and the like to implement a cross-platform solution .  Id
like a copy when your done ;).

C


"Ant" <Ant_member pathlink.com> wrote in message
news:bm7ts9$2i75$1 digitaldaemon.com...
 How can we execute a system command from D
 and grab the output ?

 I guess executing it on a separate thread should be trivial,
 (if not can you throw that in also? :)

 (I've seen:

   extern(C) int system(char*);
   int main()
   {
       system("some_program");
       return 0;
   }

   // system is <stdlib.h>
   // exec.. is <unistd.h> is it preferred on unix?
 )

 Thanks

 Ant
Oct 11 2003
next sibling parent Ant <Ant_member pathlink.com> writes:
In article <bm9k5k$1qc8$1 digitaldaemon.com>, Charles Sanders says...
You can use popen and the like to implement a cross-platform solution .  Id
like a copy when your done ;).

C
man popen "The popen() function opens a process by creating a pipe, forking, and invoking the shell." Thanks Ant
Oct 11 2003
prev sibling parent reply Ant <Ant_member pathlink.com> writes:
In article <bm9k5k$1qc8$1 digitaldaemon.com>, Charles Sanders says...
You can use popen and the like to implement a cross-platform solution .  Id
like a copy when your done ;).

C
see attachment. How do you like it? Please send back improvements or suggestions. For now this is good enought for me as I can run 'make' from leds and capture the output into a text widget :) (maybe it's just another "pointless wrappers around C runtime library functions or OS API functions" but i prefer to do it like this.) It's not ideal as we might want stderr also. (in linux/bash append " 2>&1" to the command to send stderr into stdout) Probably it's possible to grab stdin/out/err of a process that's already started but I've not idea here to look) Ant begin 0644 POpen.d M+RH*("H 4$]P96X*("H "B`J(&)Y($%N=&]N:6\ 36]N=&5I<F\*("H "B`J M(&QI8V5N<V4 3$=03`H *B\*"FUO9'5L92!03W!E;CL*"G!R:79A=&4 :6UP M;W)T(&,N<W1D:6\["G!R:79A=&4 :6UP;W)T('1H<F5A9#L*"G!R:79A=&4Z M<BH ='EP92D[" DO+VEN="!G971C7W5N;&]C:V5D*$9)3$4 *G-T<F5A;2D[ M" EI;G0 <&-L;W-E*$9)3$4 *G-T<F5A;2D["GT[" IP=6)L:6,Z"F5N=6T M4$]P96Y-;V1E"GL*"5)%040L" E74DE412P*?3L*"B\J* H *B!I;G1E<F9A M8V4 =&\ ;&ES=&5N('1O(&)Y=&4 8GD 8GET90H *B\*<'5B;&EC. II;G1E M<F9A8V4 4$]P96Y">71E3&ES=&5N97(*>PH)8FET('!O<&5N0GET94-A;&QB M86-K*&)Y=&4 8GET95)E860I.PI].PH*+RHJ"B`J(&EN=&5R9F%C92!T;R!L M:7-T96X =&\ ;&EN92!B>2!L:6YE"B`J+PIP=6)L:6,Z"FEN=&5R9F%C92!0 M3W!E;DQI;F5,:7-T96YE< I[" EB:70 <&]P96Y,:6YE0V%L;&)A8VLH8VAA M<EM=(&QI;F4I.PI].PH*+RHJ"B`J($$ 4$]P96X 97)R;W(N"B`J('1H<F]W M;CQB<CX*("H +2!T<GEI;F< =&\ =7-E(&$ 4$]P96X ;F5V97( ;W!E;F5D M(&]R(&%L<F5A9'D 8VQO<V5D"B`J("T =VAE;B!T<GEI;F< =&\ <F5A9"!F M<F]M(&$ <&EP92!T:&%T)W, =W)I=&4 ;6]D90H *B\*8VQA<W, 4$]P96Y% M<G)O<B`Z($5R<F]R"GL*"71H:7,H8VAA<EM=(&UE<W-A9V4I" E[" D)<W5P M97(H(E!/<&5N(&5R<F]R.B`B?FUE<W-A9V4I.PH)?0I].PH*+RHJ"B`J($]P M96YS(&$ <')O8V5S<R!B>2!C<F5A=&EN9R!A('!I<&4L(&9O<FMI;F<L(&%N M9"!I;G9O:VEN9R!T:&4 <VAE;&PN"B`J(%-I;F-E(&$ <&EP92!I<R!B>2!D M969I;FET:6]N('5N:61I<F5C=&EO;F%L+"!T:&4 ='EP92!A<F=U;65N="!M M87D*("H <W!E8VEF>2!O;FQY(')E861I;F< ;W( =W)I=&EN9RP (&YO="` M8F]T:#L*("H =&AE(')E<W5L=&EN9R!S=')E86T :7, 8V]R<F5S<&]N9&EN M9VQY(')E860M;VYL>2!O<B!W<FET92UO;FQY+ H *B!<=&]D;R!W<FET92!T M;R!P:7!E(&UE=&AO9`H *B!<=&]D;R`_<F5A9"!B>2!T;VME;C\*("HO"G!U M8FQI8SH*8VQA<W, 4$]P96X*>PH)<')I=F%T93H*"49)3$4J('!&:6QE.PH) M4$]P96Y-;V1E(&UO9&4[" E03W!E;DQI;F5,:7-T96YE<EM=(&QI;F5,:7-T M96YE<G,[" E03W!E;D)Y=&5,:7-T96YE<EM=(&)Y=&5,:7-T96YE<G,[" H) M<'5B;&EC. H)" DO*BH*"2`J($-R96%T97, 82!N97< 4$]P96X 86YD(&5X M96-U=&5S(&$ 8V]M;6%N9"X*"2`J($!P87)A;2!C;VUM86YD('1H92!S>7-T M96T 8V]M;6%N9"!T;R!E>&5C=71E" D *B!`;6]D92!T:&4 4$]P96Y-;V1E M(" N4D5!1"!O<B`N5U))5$4I" D *B\*"71H:7,H8VAA<EM=(&-O;6UA;F0L M(%!/<&5N36]D92!M;V1E+"!B:70 =&AR96%D960I" E[" D)=&AI<RAN=6QL M+&YU;&PL8V]M;6%N9"P ;6]D92P =&AR96%D960I.PH)?0H)" DO*BH*"2`J M($-R96%T97, 82!N97< 4$]P96X 9F]R(&$ ;&EN92!L:7-T96YE<B!A;F0 M97AE8W5T97, 82!C;VUM86YD+ H)("H 0'!A<F%M(&-O;6UA;F0 =&AE('-Y M<W1E;2!C;VUM86YD('1O(&5X96-U=&4*"2`J($!M;V1E('1H92!03W!E;DUO M9&4 *"Y214%$(&]R("Y74DE412D*"2`J+PH)=&AI<RA03W!E;DQI;F5,:7-T M96YE<B!L:7-T96YE<BP 8VAA<EM=(&-O;6UA;F0L(%!/<&5N36]D92!M;V1E M+"!B:70 =&AR96%D960I" E[" D)=&AI<RAN=6QL+&QI<W1E;F5R+&-O;6UA M;F5W(%!/<&5N(&9O<B!A(&)Y=&4 ;&ES=&5N97( 86YD(&5X96-U=&5S(&$ M8V]M;6%N9"X*"2`J($!P87)A;2!C;VUM86YD('1H92!S>7-T96T 8V]M;6%N M9"!T;R!E>&5C=71E" D *B!`;6]D92!T:&4 4$]P96Y-;V1E(" N4D5!1"!O M<B`N5U))5$4I" D *B\*"71H:7,H4$]P96Y">71E3&ES=&5N97( ;&ES=&5N M97(L(&-H87);72!C;VUM86YD+"!03W!E;DUO9&4 ;6]D92P 8FET('1H<F5A M9&5D*0H)>PH)"71H:7,H;&ES=&5N97(L(&YU;&PL(&-O;6UA;F0L(&UO9&4L M(&9O<B!A(&)Y=&4 86YD(&$ ;&EN92!L:7-T96YE<B!A;F0 97AE8W5T97, M82!C;VUM86YD+ H)("H 0'!A<F%M(&-O;6UA;F0 =&AE('-Y<W1E;2!C;VUM M86YD('1O(&5X96-U=&4*"2`J($!M;V1E('1H92!03W!E;DUO9&4 *"Y214%$ M(&]R("Y74DE412D*"2`J+PH)=&AI<RA03W!E;D)Y=&5,:7-T96YE<B!B>71E M3&ES=&5N97(L(%!/<&5N3&EN94QI<W1E;F5R(&QI;F5,:7-T96YE<BP 8VAA M<EM=(&-O;6UA;F0L(%!/<&5N36]D92!M;V1E+"!B:70 =&AR96%D960I" E[ M" D)=&AI<RYM;V1E(#T ;6]D93L*"0EA9&1">71E3&ES=&5N97(H8GET94QI M<W1E;F5R*3L*"0EA9&1,:6YE3&ES=&5N97(H;&EN94QI<W1E;F5R*3L*"0ES M=VET8V *&UO9&4I" D)>PH)"0EC87-E(%!/<&5N36]D92Y214%$. H)"0D) M87(J*2 B<EPP(BDI.PH)"0D)<F5A9"AT:')E861E9"D[" D)"0EB<F5A:SL* M"0D)" D)"6-A<V4 4$]P96Y-;V1E+E=2251%. H)"0D)<$9I;&4 /2!P;W!E M;B H8VAA<BHI*&-O;6UA;F1^(EPP(BDL("AC:&%R*BDH(G=<,"(I*3L*"0D) M"6)R96%K.PH)"7T*"7T*" DO*BH*"2`J($-L;W-E<R!T:&4 ;W!E;F5D('!I M;&]S97, =&AE(&]P96YE9"!P:7!E" D *B\*"7!R:79A=&4Z" EV;VED(&-L M;W-E*"D*"7L*"0EI9B`H('!&:6QE("$]/2!N=6QL("D*"0E[" D)"7!C;&]S M92AP1FEL92D[" D)"7!&:6QE(#T ;G5L;#L*"0E]" E]" H)<'5B;&EC. H) M" DO*BH*"2`J($%D9', 82!N97< ;&EN92!L:7-T96YE<B!T;R!T:&ES(%!/ M<&5N" D *B!`<&%R86T ;&ES=&5N97(*"2`J+PH)=F]I9"!A9&1,:6YE3&ES M=&5N97(H4$]P96Y,:6YE3&ES=&5N97( ;&ES=&5N97(I" E[" D):68 *"!L M:7-T96YE<B`A/3T ;G5L;"`I" D)>PH)"0EL:6YE3&ES=&5N97)S('X](&QI M<W1E;F5R.PH)"7T*"7T*"0H)+RHJ" D *B!!9&1S(&$ ;F5W(&)Y=&4 ;&ES M=&5N97( =&\ =&AI<R!03W!E; H)("H 0'!A<F%M(&QI<W1E;F5R" D *B\* M"79O:60 861D0GET94QI<W1E;F5R*%!/<&5N0GET94QI<W1E;F5R(&QI<W1E M;F5R*0H)>PH)"6EF(" ;&ES=&5N97( (3T](&YU;&P *0H)"7L*"0D)8GET M94QI<W1E;F5R<R!^/2!L:7-T96YE<CL*"0E]" E]" H)+RHJ" D *B!296%D M<R!B>2!B>71E(&%N9"!L:6YE(&9O<B!A;&P ;&ES=&5N97)S" D *B\*"7!R M:79A=&4)" EI;G0 <F5A9" I" E[" D):68 *"!P1FEL92`]/3T ;G5L;"`I M" D)>PH)"0ET:')O=R!N97< 4$]P96Y%<G)O<B B0V%N)W0 <F5A9"P <&EP M92!N;W0 ;W!E;B(I.PH)"7T*"0EI9B`H(&UO9&4 (3T 4$]P96Y-;V1E+E)% M040 *0H)"7L*"0D)=&AR;W< ;F5W(%!/<&5N17)R;W(H(D-A;B=T(')E860 M9G)O;2!A('=R:71E('!I<&4B*3L*"0E]" D)8VAA<EM=(&QI;F4[" D)+R]I M;G0 8V]U;G0 /2`P.PH)"6)I="!S=&]P(#T 9F%L<V4[" D)8GET92!B(#T M9V5T8RAP1FEL92D[" D)=VAI;&4H("%S=&]P("8F(&(A/45/1B`I" D)>PH) M"0DO+RLK8V]U;G0[" D)"69O<F5A8V H4$]P96Y">71E3&ES=&5N97( ;&ES M=&5N97([(&)Y=&5,:7-T96YE<G,I" D)"7L*"0D)"6QI<W1E;F5R+G!O<&5N M0GET94-A;&QB86-K*&(I.PH)"0E]" D)"6EF(" 8B`]/2`G7&XG("D*"0D) M>PH)"0D)9F]R96%C:"A03W!E;DQI;F5,:7-T96YE<B!L:7-T96YE<CL ;&EN M94QI<W1E;F5R<RD*"0D)"7L*"0D)"0DO+W-T;W` /2!L:7-T96YE<BYP;W!E M:6YE0V%L;&)A8VLH;&EN92YD=7`I.PH)"0D)?0H)"0D);&EN92YL96YG=& M/2`P.PH)"0E]" D)"65L<V4*"0D)>PH)"0D);&EN92YL96YG=& /2!L:6YE M+FQE;F=T:"LQ.PH)"0D);&EN95ML:6YE+FQE;F=T:"TQ72`]("AC:&%R*6([ M" D)"7T*"0D)8B`](&=E=&,H<$9I;&4I.PH)"7T*"0ER971U<FX ,#L*"7T* M" DO*BH*"2`J(%)E861S(&QI;F4 8GD ;&EN92!O<'1I;VYA;'D ;VX 82!S M97!A<F%T92!T:')E860*"2`J($!P87)A;2!L:7-T96YE<B!T:&4 4$]P96Y, M:7-T96YE< H)("H 0'!A<F%M('1H<F5A9&5D(&EF('1R=64 82!S97!A<F%T M92!T:')E860 =VEL;"!B92!C<F5A=&5D('1O(')E860 =&AE('!I<&4*"2`J M+PH)<')I=F%T90H)=F]I9"!R96%D*&)I="!T:')E861E9"D*"7L*"0EI9B`H M("%T:')E861E9"`I" D)>PH)"0ER96%D*"D[" D)?0H)"65L<V4*"0E[" D) M"51H<F5A9"!T:')E860 /2!N97< 5&AR96%D*"9R96%D*3L*"0D)=&AR96%D 4+G-T87)T*"D[" D)?0H)?0H*?0H ` end
Oct 13 2003
parent reply "Charles Sanders" <sanders-consulting comcast.net> writes:
Cool ill check it out when i get home :D.

C

"Ant" <Ant_member pathlink.com> wrote in message
news:bmf302$2vfc$1 digitaldaemon.com...
 In article <bm9k5k$1qc8$1 digitaldaemon.com>, Charles Sanders says...
You can use popen and the like to implement a cross-platform solution .
Id
like a copy when your done ;).

C
see attachment. How do you like it? Please send back improvements or suggestions. For now this is good enought for me as I can run 'make' from leds and capture the output into a text widget :) (maybe it's just another "pointless wrappers around C runtime library functions or OS API
functions"
 but i prefer to do it like this.)

 It's not ideal as we might want stderr also.
 (in linux/bash append " 2>&1" to the command to send stderr into stdout)
 Probably it's possible to grab stdin/out/err of a process that's
 already started but I've not idea here to look)


 Ant
Oct 13 2003
next sibling parent Ant <Ant_member pathlink.com> writes:
In article <bmf5tk$22q$1 digitaldaemon.com>, Charles Sanders says...
Cool ill check it out when i get home :D.

C
opps... probably,after the cycle on read(), we need: // not tested if ( line.length > 0 ) { foreach(POpenLineListener listener; lineListeners) { listener.popenLineCallback(line.dup); } } but I guess this will never get us the last line if it's empty... Ant
Oct 13 2003
prev sibling parent Ant <Ant_member pathlink.com> writes:
In article <bmf5tk$22q$1 digitaldaemon.com>, Charles Sanders says...

You can use popen and the like to implement a cross-platform solution .
So, will it run on Windows just how it is? (I added a notification of "job end" to the interfaces.) Ant
Oct 15 2003