[rlug] Pipe/redirect

Petru Rațiu rpetre at gmail.com
Sun Jul 29 09:30:19 EEST 2018


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.



More information about the RLUG mailing list