Szaisztok!
Egy ilyen csővezetékem van:
tar -c tarolni/ | gzip > tarolni.tar.gz
Ez ugye így jólismert, egyszerű.
A kérdésem az lenne, hogy a tar visszatérési értékét hogyan lehetne kiolvasni, vagy egyéb módon hogy lehet a tar parancs hibás lefutását detektálni?
Ugyanis ha például van egy fájl a tarolandó könyvtárban, amire a felhsznánólak nincs olvasási joga, akkor ilyen hibaüzenetet ad, és 2 értékkel tér vissza a tar:
tar: tarolni/megatitok: Cannot open: Permission denied
Azt szertném, hogy a szkriptem felismerje az ilyet(és egyéb hibákat) automatikusan, viszont az echo $? 0-t ad vissza, mivel a csővezeték utolsó darabja, a gzip helyesen lefutott.
Tudom, hogy a tar és gzip hívásokat össze lehet vonni, ez csak egy egyszerű példa a problémára. Amit meg szeretnék oldani, ott nem lehet ilyen egyszerűen összevonni.
- 1633 megtekintés
Hozzászólások
Hali!
man bash- ben keress rá arra, hogy PIPESTATUS, vagy PIPESTATUS array. Most fejből nem vágom, de anno nekem is kellett, s az segített.
- A hozzászóláshoz be kell jelentkezni
Na, egy rövid példa:
egy:
#!/bin/bash
exit 1;
null:
#!/bin/bash
exit 0;
----
./egy $? ==>> 1
./null $? ==>> 0
./egy | ./null $? ==>> 0; PIPESTATUS = 1
Tehát a lefutása után az első pipe visszatérési értéke a PIPESTATUS változóban lesz.
Ha meg több van, akkor értelemszerűen: ${PIPESTATUS[n]}, ahol az n. program száma (0- tól kezdve a számozást).
- A hozzászóláshoz be kell jelentkezni
#!/bin/sh
(true; echo $? > tmp_1) | (false; echo $? > tmp_2) | ( true; echo $? > tmp_3 )
RC1=`cat tmp_1`; rm tmp_1
RC2=`cat tmp_2`; rm tmp_2
RC3=`cat tmp_3`; rm tmp_3
echo RC1: $RC1
echo RC2: $RC2
echo RC3: $RC3
#
true | false | true
echo ${PIPESTATUS[*]}
#
- A hozzászóláshoz be kell jelentkezni
hm,
tar -czf
?
- A hozzászóláshoz be kell jelentkezni
Köszi a válaszokat!
Magamtól nem találtam rá, pedig gugliztam sokat.
Már csak az a kérdésem, hogy van e jó tipp arra, hogy lehetne minélegyszerűbben tesztelni, hogy a cső bármely tagja nem 0-t adott vissza, és ha így volt, akkor az eredeti szkriptet nem 0-val visszatéríteni?
Tehát valami, ami nem vizualizálja, hanem ellenőrzi az echo {$PIPESTATUS[*]} értékét.
- A hozzászóláshoz be kell jelentkezni
Mondjuk összeadod az array összes elemét, és az eredményt adod meg a script visszatérési értékének?
Ha ügyesen variálod, akkor a visszatérési értékből még azt is ki tudod majd olvasni, hogy a pipe hanyadik eleme hasalt el.
Csaba
- A hozzászóláshoz be kell jelentkezni