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