Dlaczego po użyciu bash i zawieszeniu pętli while pętla zatrzymuje się po wznowieniu? Krótki przykład poniżej.
$ while true; do echo .; sleep 1; done
.
.
^Z
[1]+ Stopped sleep 1
$ fg
sleep 1
$
Znam sygnały i domyślam się, że może to być naturalne zachowanie basha, ale chciałbym lepiej zrozumieć, dlaczego tak się zachowuje.
bash
shell
signals
background-process
BKZLAND
źródło
źródło
$?
po powrocie, i tak teżtrue
nie jesttrue
. prawdopodobnie. Myślę.Odpowiedzi:
To wygląda jak błąd w kilku powłokach, działa zgodnie z oczekiwaniami z ksh93 i zsh .
Tło:
Większość pocisków wydaje się uruchamiać pętlę while wewnątrz głównej powłoki i
Bourne Shell zawiesza całą powłokę, jeśli wpiszesz ^ Z za pomocą powłoki niezalogowanej
bash zawiesza tylko,
sleep
a następnie pozostawia pętlę while na rzecz drukowania nowego polecenia powłokimyślnik sprawia, że polecenie to nie jest zawieszalne
Z ksh93 rzeczy działają zupełnie inaczej:
ksh93 robi to samo, gdy polecenie jest uruchamiane za pierwszym razem, ale jako
sleep
buitin w ksh93, ksh93 ma moduł obsługi, który powoduje, że pętla while rozwidla główną powłokę, a następnie zawiesza się podczas wpisywania ^ Z.Jeśli wpiszesz w ksh93 później
fg
, rozwidlone dziecko, które nadal uruchamia pętlę, jest kontynuowane.Widzisz główną różnicę podczas porównywania komunikatów kontroli zadań z bash i ksh93:
raporty bash :
[1]+ Stopped sleep 1
ale raporty ksh93 :
^Z[1] + Stopped while true; do echo .; sleep 1; done
zsh zachowuje się podobnie do ksh93
W przypadku obu powłok masz jeden proces (główną powłokę), o ile nie wpiszesz ^ Z, i dwa procesy powłoki po wpisaniu ^ Z.
źródło
dash
naprawdę nie kończy obsługi sygnału po zakończeniu pętli? w[d]?ash
kodzie źródłowym są wszystkie te makra dla INTON i INTOFF rozproszone, i zazwyczaj sygnały odbierane w stanie INTOFF są obsługiwane w INTON (lub wokół niego) . w każdym razie jestem ciekaw, bo myślę, że wiesz lepiej - to świetna odpowiedź. Dziękuję Ci.sleep 100
można zawiesić i wznowićdash
, więc wydaje się, żedash
wie o problemach z tym poleceniem i selektywnie wyłącza kontrolę zadań.dash
wydajność w innych powłokach, porzucając przetwarzanie wielobajtowe? i tak,dash
obsługuje kontrolę zadań, ale standard mówi, że powłoka interaktywna powinna ignorować TSTP, a uruchomienie pętli while w bieżącej powłoce na terminalu interaktywnym jest nie mniej niż powłoką interaktywną.Napisałem o tym jednym ze współautorów Basha, a oto jego odpowiedź:
Więc jeśli ktoś chce przesłać łatkę, użyj adresów e-mail znalezionych na stronach podręcznika man.
źródło