bash script pipe köztes fokozatának visszatérési értéke

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.

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.

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).


#!/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[*]}

#

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.