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
- 4476 megtekinté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 hozzászóláshoz be kell jelentkezni
Köszönöm a hozzászólásod, de sajnos itt nekem párhuzamosításra van szükségem. A pontosvessző pedig sorosít, ezért mivel mind blokkolós, így soha nem futna le.
- A hozzászóláshoz be kell jelentkezni
Azt látom, hogy nem érted amit írtam. Akkor maradjunk annyiban, hogy próbáld ki! Kerek zárójelek helyett használj kapcsosat. De figyelj oda a szintaxisra, amit fent leírtam.
- A hozzászóláshoz be kell jelentkezni
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! ;)
- A hozzászóláshoz be kell jelentkezni
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.)
- A hozzászóláshoz be kell jelentkezni
É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...
- A hozzászóláshoz be kell jelentkezni
Párhuzamos folyamatok között - ha a feladat megkívánja - szükség van adatcserére és szinkronizálásra.
Ez egy megkívánó feladat, de egyik feltétel sem adott hozzá.
- A hozzászóláshoz be kell jelentkezni