Dlaczego poniższe polecenie nie wychodzi? Zamiast wyjść, pętla działa w nieskończoność.
Podczas gdy odkryłem to zachowanie za pomocą bardziej złożonej konfiguracji, najprostsza forma polecenia sprowadza się do następujących.
Nie wychodzi:
while /usr/bin/true ; do echo "ok" | cat ; done | exit 1
Powyżej nie ma literówek. Każdy „|” jest fajką. „Wyjście 1” oznacza kolejny proces, który został uruchomiony i zakończył się.
Oczekuję, że „wyjście 1” spowoduje SIGPIPE w pętli while (zapisz na potoku bez czytnika) i spowoduje przerwanie się pętli. Ale pętla nadal działa.
Dlaczego polecenie się nie zatrzymuje?
linux
command-line
bash
shell
bash-scripting
stephen.z
źródło
źródło
Odpowiedzi:
Wynika to z wyboru w realizacji.
Uruchomienie tego samego skryptu w systemie Solaris z
ksh93
innym zachowaniem:To, co wyzwala problem, to wewnętrzny potok, bez niego pętla wychodzi bez względu na powłokę / system operacyjny:
cat
odbiera sygnał SIGPIPE pod bash, ale powłoka i tak iteruje pętlę.Dokumentacja Bash stwierdza:
Dokumentacja Ksh stwierdza:
POSIX stwierdza:
źródło
echo
ignoruje SIGPIPE. Możesz także odtworzyć problem, używającenv echo
zamiastecho
(aby wymusić użycie rzeczywistegoecho
pliku binarnego). (Porównaj także wyniki{ echo hi; echo $? >&2; } | exit 1
i{ env echo hi; echo $? >&2; } | exit 1
.)Ten problem mnie martwił od lat. Dzięki jilliagre za szturchnięcie we właściwym kierunku.
Powtarzając trochę pytanie, na moim Linux-ie, to wychodzi zgodnie z oczekiwaniami:
Ale jeśli dodam potok, nie kończy się zgodnie z oczekiwaniami:
To frustrowało mnie przez lata. Rozważając odpowiedź napisaną przez Jilliagre, wymyśliłem tę cudowną poprawkę:
QED ...
Cóż, niezupełnie. Oto coś nieco bardziej skomplikowanego:
To nie działa dobrze. Dodałem
|| exit
tak, aby wiedział, jak zakończyć wcześniej, ale pierwszyecho
nie pasuje do,grep
więc pętla natychmiast się kończy. W takim przypadku naprawdę nie interesuje Cię status wyjściagrep
. Moim obejściem jest dodanie kolejnegocat
. Oto wymyślony skrypt o nazwie „tens”:To właściwie kończy się, gdy działa jako
tens | head
. Dzięki Bogu.źródło