2013-07-19 22 views
11

Czy jest jakaś podobna opcja w powłoce myślnika odpowiadająca pipefail w bash?odpowiednik pipefail w desce rozdzielczej powłoki

Lub jakikolwiek inny sposób uzyskania niezerowego statusu, jeśli jedno z poleceń w rurze zawiodło (ale nie było na nim wyjścia, które ustawiłoby -e).

Aby uczynić go bardziej zrozumiałym, tutaj jest przykładem tego, co chcę osiągnąć:

w próbce debugowania makefile, moja zasada wygląda następująco:

set -o pipefail; gcc -Wall $$f.c -o $$f 2>&1 | tee err; if [ $$? -ne 0 ]; then vim -o $$f.c err; ./$$f; fi; 

zasadzie to działa otwiera plik o błędzie i plik źródłowy o błędzie i uruchamia programy, gdy nie ma błędu. Zapisuję trochę pisania. Powyższy urywek działa dobrze na bashu, ale mój nowszy system Ubunty używa myślnika, który nie obsługuje opcji pipefail.

Chcę zasadniczo stan awarii, jeśli pierwsza część poniższej grupy poleceń fail:

gcc -Wall $$f.c -o $$f 2>&1 | tee err 

tak, że mogę użyć tego do instrukcji IF.

Czy istnieją alternatywne sposoby osiągnięcia tego celu?

Dzięki!

+1

Dlaczego nie po prostu pozbyć się 'tee'? 'jeśli gcc -Wall $$ f.c -o $$ f> $$ f.log 2> & 1; następnie cat $$ f.log; ./$$f; else vim -o $$ f.c $$ f.log; fi' (Alternatywnie, zainstaluj 'bash' na Ubunty, to tylko apt-get.) – rici

+0

@rici Dzięki! Używałem tee, ponieważ chciałem również wydrukować wydruki stderr na ekranie - głównie po to, aby zobaczyć, czy były jakieś ostrzeżenia. Ale jeśli nie ma innego wyjścia, prawdopodobnie przerzucę się na to, co sugerujesz. O instalacji bash: założyłem (bez żadnych badań), że myślnik jest krokiem naprzód z bash, więc nie chciałem się wycofać, ale teraz trochę google o tym, wydaje się, że niekoniecznie musi tak być. Przeczytam trochę więcej o różnicach, a następnie zdecyduję. Jeszcze raz dziękuję za oba wskaźniki! – Lavya

+1

Miałam nadzieję, że zestaw -e wspomniany powyżej dostarczy mi myślnik będący odpowiednikiem zestawu -o pipefail, ale nie tak: '$ dash -c 'set -e; false | kot'; echo $? $ ' –

Odpowiedz

6

z „ręki” odpowiedź dla implementacji POSIX PIPESTATUS/pipefail jest w comp.unix.shell FAQ Q11

+3

To nie odpowiada na pytanie. W tym dokumencie opisano sposób umieszczenia kodu wyjścia potokowych poleceń w oddzielnych zmiennych. Jest to jednak dość odległe od pytania, które chce, aby powłoka automatycznie się zakończyła, gdy tylko polecenie potokowe zakończy się niepowodzeniem. "RTFM" obowiązuje tylko wtedy, gdy "FM" faktycznie odpowiada na pytanie. – vog