2012-02-14 15 views
12

Jak uzyskać kod zakończenia wget z procesu podpowłoki?Uzyskaj kod wyjścia z podpowłoką przez rurki

Głównym problemem jest to, że $? ma wartość 0. Gdzie można założyć $?=8?

$> OUT=$(wget -q "http://budueba.com/net" | tee -a "file.txt"); echo "$?" 
0 

Działa bez tee, rzeczywiście.

$> OUT=$(wget -q "http://budueba.com/net"); echo "$?" 
8 

Ale ${PIPESTATUS} array (nie jestem pewien, jest to związane z tym sprawy) również nie zawiera tę wartość.

$> OUT=$(wget -q "http://budueba.com/net" | tee -a "file.txt"); echo "${PIPESTATUS[1]}"  

$> OUT=$(wget -q "http://budueba.com/net" | tee -a "file.txt"); echo "${PIPESTATUS[0]}" 
0 

$> OUT=$(wget -q "http://budueba.com/net" | tee -a "file.txt"); echo "${PIPESTATUS[-1]}" 
0 

Więc moje pytanie jest - jak można uzyskać wget „s kod wyjścia poprzez tee i podpowłoki?

Jeśli to może być pomocne, moja wersja bash to 4.2.20.

Odpowiedz

13

Używając $() tworzysz (skutecznie) podpowłokę. Tak więc instancja PIPESTATUS, którą należy przejrzeć, jest dostępna tylko wewnątrz podpowłoki (tj. Wewnątrz $()), ponieważ zmienne środowiskowe nie rozprzestrzeniają się z procesów potomnych na nadrzędne.

Można zrobić coś takiego:

OUT=$(wget -q "http://budueba.com/net" | tee -a "file.txt"; exit ${PIPESTATUS[0]}); 
    echo $? # prints exit code of wget. 

można osiągnąć podobne zachowanie za pomocą następujących czynności:

OUT=$(wget -q "http://budueba.com/net") 
    rc=$? # safe exit code for later 
    echo "$OUT" | tee -a "file.txt" 
+0

ale jest to możliwe, aby wyeksportować wszystkie '$ {PIPESTATUS}' tablicę górę do powłoki rodzica? –

+1

To nie działa ['export'] (http://www.gnu.org/software/bash/manual/bashref.html#Environment) - eksportuje zmienne jako zmienne środowiskowe dla procesów * potomnych * (od rodzica)). –

+0

Oto rozwiązanie umożliwiające przeniesienie całej tablicy '$ {PIPESTATUS [@]}' do skryptu nadrzędnego] (https://stackoverflow.com/questions/41716616/get-exit-codes-of-a-pipe- gdy-output-is-assign-to-variable-command-substituti/44314883 # 44314883). Polega na dodaniu go na końcu utworzonej zmiennej, a następnie przeniesieniu jej do nowej tablicy. –

3

Strzeż się tego przy użyciu local zmienne:

local OUT=$(command; exit 1) 
echo $? # 0 

OUT=$(command; exit 1) 
echo $? # 1 
+3

Deklaracja 'local OUT', a następnie przypisanie' OUT = 'w nowym wierszu poprawnie ustawia zmienną kodu wyjścia' $? ', Jeśli nie chcesz funkcji creep. –

Powiązane problemy