a párhuzamosítás megbolondítja

Szervusztok!

A kimeneti érték nálam az inicializálláskori. Ki érti ezt?
Mit gondolok rosszul? Kösz, vfero

(GNU bash, version 4.2.37(1)-release (x86_64-pc-linux-gnu), wheezy)


#!/bin/bash -u

mknod time p &>/dev/null
mknod rc p &>/dev/null

r="R"
t="T"
(time (echo "hello" &> rc) &> time) & (t=`cat time`) & (r=`cat rc`)

echo "rc: " $r " time: " $t

UPDATE:
Így kell az ilyet csinálni:


{ time (echo "hello" &> rc ; sleep 1) &> time ; t=`cat time` ; r=`cat rc` ; }

Kösz Zahy, a megoldást a kapcsos valóban nyújtja! ;)

UPDATE2:
Ez a megoldás csak a wheezy:amd64-n megy ahol fejlesztek, de a squeeze:i686 így nem szereti. :S

Hozzászólások

Ha egyszer párhuzamosítod, akkor majd az ütemező eldönti, hogy mikor melyiket hajtja végre. Azaz ettől máris futhat korábban a cat (ebből következőleg az értékadások), mint a különböző kiírások.
Mondjuk a valódi probléma az, hogy amit kerek zárójelek között írsz, az deklaráltan egy másik, alshell-ben hajtódik végre - így aztán az értékadás eredményét az eredeti shell-ben nem tudod látni. Ha mnindenáron a párhuzamoítással akarsz játszani, akkor minden

( parancs )

helyett használj kapcsos zárójelet így

{ parancs ; }

ugyanis a kapcsos-zárójelben szereplő parancsok ugyanabban a shellben hajtódnak végre. próbáld ki valami egyszerűbb dologgal, hogy elhidd:

a=1
echo $a
( a=2 ; echo $a )
echo $a
{ a=3 ; echo $a ; }
echo $a

A kód blokk miért más feldolgozás szempontjából? A sima pontosvessző csak tagolja a parancsokat, kipróbáltam, akár több sorba is írhatok több parancsot, úgy is működik. A kód blokkban más szerepe is van talán az utolsónak, mert az nagyon kell neki.
Érdekes, ezt itt sem említi...
http://www.gnu.org/software/bash/manual/html_node/Command-Grouping.html

Kösz +1x! ;)

Hát én konkrétan nem azt mondtam, amit kihoztál belőle, mert te a párhuzamosítás helyett valóban sorossá tetted.

(time (echo "hello" &> rc) &> time) & (t=`cat time`) & (r=`cat rc`)

helyett:

{ time { echo "hello" &> rc;} &> time;} & { t=`cat time`;} & { r=`cat rc`;}

Még szóltam is, hogy az értékadásnál van a lényeg. (Az első, háttérben futó parancsot futtathatod alshellben, nem érdekes - azaz ott nyugodtan használhatod a kerek zárójelet is akár. A kritikus, hogy a két értékadást kapcsos-zárójelek közé tedd a kerek helyett.)

Én párhuzamosnak gondolnám, mert tapasztalatom szerint a pipe-ok addig blokkolnak, amíg nem kezded mindkettőt olvasni. Az én megoldásom viszont fut de csak wheezy alatt (lsd. UPDATE2), tehát a gyanúm az, hogy ez párhuzamosan dolgozódik így. A Te javaslatod viszont a time kimenetét nem szedi össze.
Ledadogtam...