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 <[email protected]> wrote: 2018-07-29 7:41 GMT+03:00 MOROIANU Dragos <[email protected]>:
> 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 [email protected] http://lists.lug.ro/mailman/listinfo/rlug_lists.lug.ro _______________________________________________ RLUG mailing list [email protected] http://lists.lug.ro/mailman/listinfo/rlug_lists.lug.ro
