RE: l'art pour lart
Maulis Adam <maulis@ludens.elte.hu>
Sziasztok,
> Nekem ez működött - ha ilyesmire gondoltál
>
> PIPE PIPECMD:==@SYS$INPUT ; SEA FILE.COM " DF " | PIPECMD
minidg elhatározom, hogy kicsit bővebben belemászok a pipe-be,
mert egyszerrűen túl izgalmas, ahogy a unixoid concept
társul a DCL másjellegű kiértékelési szokásaival ;-)
A fenti parancs kibontva
1) A master processzben (ahol a paracsot kiadod)
$ PIPECMD:==@SYS$INPUT
2) k'et subprocess készítése. A symbol átmasolodik mind a két
subprocessbe.
3) az egyikben elindul a SEA FILE.COM " DF " kimenetét
átiranyitva a vele párhuzamosan elindult másik process
bemenetére. A másik processben elinditja a PIPECMD
(ami letezik, mivel a dcl másolja a subprocessnél a symbolokat)
(Megy local symbollal is.)
Megjegyzéseim hozzá:
0) a fenti működés miatt fontos a precedencia.
A parancs
parancs1 ; ( parancs2 | parancs3 )
kiertékelési sorrendű. (Nyilván, de azert leírtam.)
1) én ezt nem találtam volna ki. Valahogy nem tudom eléggé
keverni a DCL és a unix shell trükköket ;-)
2) Magát a feladatot sem találtam volna ki.
Bár, néha, amikor ultrafontos temporary file nélkül megoldani
a feladatot, sokat játszom a pipe-el.
Egyébként nem szeretem a PIPE parancsot a következő probléma miatt:
$ dir ;
$ pipe dir ;
3) röviditeni tudok. A fenti esetben felesleges a global symbol:
$ PIPE SEA FILE.COM " DF " | @SYS$PIPE
Általában a SYS$PIPE logicalt használom, ami megegyezik a SYS$INPUT-tal
pipe esetében. Akkor miért használom a SYS$PIPE-t? Csak. rövidebb ;-)
> Alighanem a második parancsnak meg kell várnia az
> első (globális(!!) szimbólum definíció) végét, a
> harmadiknak viszont párhuzamosan kell végrehajtódnia
> a másodikkal, mert különben annak befejezése után is
> tovább akar olvasni a sys$inputról. Ádám! Miért?)
Ez, gondolom én vagyok.
De nem értem a kérdést.
Valoszinű a válasz a pipe működésének fenti magyarázatában van,
mely szerint a második processz inputja az első processz outputja,
és, ha ezen EOF érkezik, akkor arra a DCL lezárja a parancsfájlt.
Játék:
$ pipe show proc ; show proc | ( type sys$pipe ; show proc )
az utobbi zárojeles kifejezés 1 proceszben fut, lásd:
$ pipe show proc ; show proc | ( type sys$pipe ; show proc ; show proc )
a type sys$pipe nem elhagyható, hiszen a második show proc kimenetét
nem lenne, ki kiírja.
$ pipe sh log/proc | ( type sys$pipe ; write sys$output "----" ; sh log/proc)
És az elsőben látod a
SYS$OUTPUT" [super] = "_SCSNAME$MPAxx:"
a második a neki megfelelő
"SYS$PIPE" = "_SCSNAME$MPAxx:"
Egyébként, ha már itt tartok,
$ anal/sys
SDA> show device mpa
driver: SYS$PIPEDRIVER
Nem tud valaki programozói leírást (QIO interface) a SYS$PIPEDRIVER-hez?
Az IO User's Reference Manual -ban nincs. Vagy csak én nem lelem.
( http://h71000.www7.hp.com/doc/731FINAL/6136/6136PRO.HTML )
>
> Wacha Imre
>
Üdv,
Maulis Ádám