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...
Conditional pipeing...
- Osprey
- Inlägg: 6310
- Blev medlem: 06 apr 2008, 00:09
- OS: Ubuntu
- Ort: Göteborg/Mölndal/Falkenberg
- Kontakt:
Conditional pipeing...
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
- Konservburk
- Inlägg: 5919
- Blev medlem: 07 apr 2007, 22:28
Re: Conditional pipeing...
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.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...
- Osprey
- Inlägg: 6310
- Blev medlem: 06 apr 2008, 00:09
- OS: Ubuntu
- Ort: Göteborg/Mölndal/Falkenberg
- Kontakt:
Re: Conditional pipeing...
Jag tackar, nu lärde jag mig något nytt!
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...

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...
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
- Konservburk
- Inlägg: 5919
- Blev medlem: 07 apr 2007, 22:28
Re: Conditional pipeing...
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.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...
- Osprey
- Inlägg: 6310
- Blev medlem: 06 apr 2008, 00:09
- OS: Ubuntu
- Ort: Göteborg/Mölndal/Falkenberg
- Kontakt:
Re: Conditional pipeing...
Det är förstås helt sant och väl värt att ha i åtanke...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.
Agera genom att ta och behålla initiativet, ta de risker detta kräver...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...
http://www.enargo.com/it/
OpenVMS Shark - i Linux finns inte SYS$CMKRNL...