Sida 1 av 1

Conditional pipeing...

Postat: 31 jan 2011, 10:27
av Osprey
Finns det något sätt att göra conditional pipeing, dvs att om ett kommando går bra, så ska resultatet pipe:as till ett annat kommando, men annars ska hela kedjan avbrytas...

En kedja/sekvens av kommandon utan pipeing som fungerar så kan ju utryckas som "a && b &&c" liksom en pipe-kedja som "a | b | c", men går det att kombinera detta och åstadkomma något som liknar "a &&| b &&| c", eller hur det nu ska uttryckas..?

[Edit] Det går givetvis lätt att åstadkomma detta genom att skriva resultatet från kommandon till en fil som nästa kommando läser in efter att man kollat status från det första kommandot etc. Men finns det något enkelt sätt att åstadkomma detta direkt i en pipe..?

[Edit igen] Tänkte att det kunde kanske vara bra att jag tar med anledningen till att jag behöver det här med...

Om jag kör t.ex "ls <nonexistent-file> | cat" så får jag success (0) som returstatus trots att "ls" misslyckas och orsaken till det är att pipe:n fortsätter med "cat" som i sin tur "lyckas" trots att det inte finns något att göra... I det läget skulle jag alltså behöva att pipe:n avbröts och att den felstatus som gjorde att det avbröts (den från "ls" alltså) returnerades...

Re: Conditional pipeing...

Postat: 31 jan 2011, 19:41
av Konservburk
Osprey skrev:Om jag kör t.ex "ls <nonexistent-file> | cat" så får jag success (0) som returstatus trots att "ls" misslyckas och orsaken till det är att pipe:n fortsätter med "cat" som i sin tur "lyckas" trots att det inte finns något att göra... I det läget skulle jag alltså behöva att pipe:n avbröts och att den felstatus som gjorde att det avbröts (den från "ls" alltså) returnerades...
I bash finns variablen $PIPESTATUS för att hantera sånt. Ska du få till något motsvarande i äldre skal så blir det nog ganska fult med en massa omdirigeringar av fildeskriptorer hit och dit.

Re: Conditional pipeing...

Postat: 31 jan 2011, 20:42
av Osprey
Jag tackar, nu lärde jag mig något nytt! :D

Medan jag satt och testade så hittade jag också ett ännu enklare sätt att fixa till det...
det enda jag behöver göra är att köra "set -o pipefail" någonstans innan pipe:n...

Re: Conditional pipeing...

Postat: 31 jan 2011, 21:02
av Konservburk
Osprey skrev:Medan jag satt och testade så hittade jag också ett ännu enklare sätt att fixa till det...
det enda jag behöver göra är att köra "set -o pipefail" någonstans innan pipe:n...
Tänk dock på pipefail ger dig felstatus för det sista kommandot som misslyckades, vilket inte nödvändigtvis behöver vara det kommando som orsakade felet från böran. Med $PIPESTATUS får du tillgång till felstatusen för alla de olika delarna och du vet framförallt vilken felstatus som hör till vilket kommando.

Re: Conditional pipeing...

Postat: 31 jan 2011, 21:08
av Osprey
Konservburk skrev:Tänk dock på pipefail ger dig felstatus för det sista kommandot som misslyckades, vilket inte nödvändigtvis behöver vara det kommando som orsakade felet från böran.
Det är förstås helt sant och väl värt att ha i åtanke...