Conditional pipeing...

Här diskuterar vi skal, kommandon och klassiska linuxverktyg.
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Conditional pipeing...

Inlägg 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...
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...
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Conditional pipeing...

Inlägg 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.
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: Conditional pipeing...

Inlägg 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...
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...
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: Conditional pipeing...

Inlägg 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.
Användarvisningsbild
Osprey
Inlägg: 6310
Blev medlem: 06 apr 2008, 00:09
OS: Ubuntu
Ort: Göteborg/Mölndal/Falkenberg
Kontakt:

Re: Conditional pipeing...

Inlägg 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...
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...
Skriv svar

Återgå till "Terminalforum"