[rlug] Pipe/redirect

MOROIANU Dragos dmoroian at yahoo.com
Mon Jul 30 19:52:54 EEST 2018


 Programul pe care vreau sa-l scriptez se numeste Xfoil (http://web.mit.edu/drela/Public/web/xfoil/) si care se comporta in mare masura la fel ca bc (accepta comenzi de la tastatura, face niste calcule si tipareste rezultatele pe ecran).Vreau sa-l folosesc pentru o problema de optimizare a unei forme geometrice, de aceea am nevoie de automatizare.Am cam renuntat la ideea de a-l comanda din bash, si am abordat problema cu ajutorul a 2 "named pipe" (unul pentru a trimite comenzi si al doilea pentru a primi rezultate), folosind standard C. Asa pot tine pipe-ul deschis cat doresc. Buffer-ul de la mine catre xfoil il golesc usor cu fflush, dar invers nu stiu daca pot comanda golirea. Sper ca asta sa nu-mi afecteze negativ interactiunea.
Multumesc frumos pentru idei si sugestii,Dragos
    On Saturday, July 28, 2018, 11:37:09 PM PDT, Petru Rațiu <rpetre at gmail.com> wrote:  
 
 2018-07-29 7:41 GMT+03:00 MOROIANU Dragos <dmoroian at yahoo.com>:

>  Interesant 'expect' dar nu m-am prins daca pot executa ceva cu numere. De
> exemplu:raspuns=$(echo "2+3" | bc)if (( $raspuns > 5 )); then    echo "6*3"
> | bc
> else    echo "7*3" | bc
> fi
> Toate comenzile de mai sus vreau sa le execut fara sa termin programul
> 'bc' de 3 ori. Se poate asta cu 'expect'?
>

Tu de fapt ce program vrei sa scriptezi? "bc" nu are state si e irelevant
daca 2+3 sau 6*3 iti calculeaza aceeasi instanta de bc sau nu.

Expect opereaza pe principiul unei sesiuni interactive cu ceva si il inveti
cum sa reactioneze la diverse prompturi ( "ruleaza ssh catre masina aia,
cand vezi promptul "Password:" trimiti parola asta, dupa aia astepti pana
vezi un prompt de bash, si atunci ii dai un "rm -r /", dupa care astepti un
prompt cu "are you sure", ii zici "yes", dupa care astepti alt prompt de
bash si scrii local "mission accomplished"). Banuiala mea e ca ceva de
genul asta vrei si tu, da' daca tot ii dai cu echo si bc, o sa ne tot
chinuim cu pipe-uri si subshelluri...

Revenind la exemplul cu echo si bc, problema e ca pipe-urile sunt
unidirectionale. Tu practic vrei sa pui pe pauza ce scrii in pipe-ul de
stdin pentru procesul ala pana vine ceva pe stdout, iei ceva decizii si
continui. Ca sa poti face asta, trebuie ca ambele pipe-uri sa bata in
acelasi proces in partea cealalta (practic ala care face if). Cu putin chin
faci asta si in bash, dar mai apar o serie de probleme cauzate de bufferele
pipe-urilor (cum te asiguri ca ai citit tot ce s-a scris la stdout inainte
sa decizi daca ii dai sau nu ceva la stdin?  sunt niste buffere pe drum
care trebuie golite explicit), asa ca mai devreme sau mai tarziu ajungi sa
faci asta in ceva limbaj mai avansat, care iti da instrumente mai flexibile
de lucru cu file descriptors.

Dar ma rog, asta iar depinde de care anume e usecase-ul tau, ca poate n-are
rost sa inventezi motorul cu combustie interna doar pentru carat 3 busteni
20 de metri.

-- 
P.
_______________________________________________
RLUG mailing list
RLUG at lists.lug.ro
http://lists.lug.ro/mailman/listinfo/rlug_lists.lug.ro
  


More information about the RLUG mailing list