Pełna część strony podręcznika użytkownika Bash, która ma zastosowanie, mówi tylko:
Jeśli system operacyjny, na którym działa bash, obsługuje kontrolę zadań, bash zawiera narzędzia do korzystania z niego. Wpisanie znaku wstrzymania (zazwyczaj ^ Z, Control-Z) podczas działania procesu powoduje, że proces ten zostaje zatrzymany i przywraca kontrolę do bash. Wpisanie znaku opóźnionego zawieszenia (zwykle ^ Y, Control-Y) powoduje zatrzymanie procesu, gdy próbuje on odczytać dane wejściowe z terminala, i sterowanie zostaje zwrócone do bash. Użytkownik może następnie manipulować stanem tego zadania, używając
bg
polecenia, aby kontynuować je w tlefg
polecenie, aby kontynuować na pierwszym planie, lub polecenie zabicia, aby go zabić. ^ Z zaczyna działać natychmiast i ma dodatkowy efekt uboczny, powodując odrzucenie oczekujących danych wyjściowych i typów.
Nigdy nie korzystałem Ctrl- Y; Właśnie się o tym dowiedziałem. Zrobiłem dobrze tylko z Ctrl- Z(zawiesić).
Próbuję sobie wyobrazić, co ta opcja jest dla . Kiedy to byłoby przydatne?
(Zauważ, że ta funkcja nie istnieje we wszystkich wariantach Uniksa. Jest obecna w Solarisie i FreeBSD, ale nie w Linuksie. Odpowiednie ustawienie to stty dsusp
.)
Być może mniej subiektywnie: czy jest coś, co można osiągnąć Ctrl- Yczego nie da się osiągnąć równie łatwo Ctrl- Z?
źródło
stty dsusp
, nie udało mi się wysłać SIGTSTP po ^ Y (zrobiłem na Solarisie). Czy ty?Odpowiedzi:
Z podręcznika 4BSD dla csh :
Dlatego celem jest wpisanie wielu danych wejściowych podczas przetwarzania pierwszego i zatrzymanie zadania po ich zakończeniu.
źródło
^Y
zostaną odczytane pomyślnie, a następnie, gdy^Y
jest trafiony proces zostanie zatrzymany. Czy czytam to prawda?^Y
, nawet jeśli wyrzekłeś się procesu i zamknąłeś terminal przed wznowieniem. Dobrze? ( „... po wznowieniu otrzymuje dane wejściowe sprzed ^ Y.” To właśnie miałem na myśli; zwykle nie zajmuję się kodem C.) :)Powiedzmy, że istnieje wejście do odczytu i wykonywania w pętli. Przydatne może być pozostawienie zadania do zakończenia bieżącej instrukcji, którą oblicza, bez przerywania go, zanim wróci do wiersza poleceń w celu uzyskania nowej. Tak więc, aby zakończyć cykl. To z wdziękiem kończy pętlę i zapobiega jej ponownemu uruchomieniu, jeśli
read
jest ograniczona limitem czasu.źródło
^Z
go wtedy .Mogę wymyślić jeden scenariusz, w którym może być przydatny, ale jest to coś w rodzaju wymyślonego przypadku.
Załóżmy, że debugujesz skrypt zapisujący pliki tymczasowe, które chcesz przeanalizować, zanim zostaną usunięte w ramach procedury czyszczenia.
Możesz dodać
read foo
gdzieś po zapisaniu plików (ale przed czyszczeniem), uruchom skrypt i naciśnij Ctrl- Ypodczas ich generowania. Nastąpi wyświetlenie monitu ze skryptem zawieszonym w tle, aby zrobić wszystko, co musisz zrobić, a następnie możeszfg
pozwolić na zakończenie skryptu.źródło
^Z
. Innymi słowy: po wpisaniufg
trzeba będzie dać skrypt pewien wkład w każdym razie , zanim będzie ona kontynuowana. Stąd moje pytanie; Nadal nie widzę sensu^Y
. (Dziękuję za odpowiedź!) :)Jedynym scenariuszem, jaki mogę wymyślić (a nawet nie uważam tego za bardzo przekonujące), jest to, że chcesz użyć polecenia typu polecenie z wyprzedzeniem. Powiedzmy, że uruchomione jest polecenie, które w przyszłości odczyta dane wejściowe. Następnie możesz ^ Y to, a następnie natychmiast wpisać następne polecenie powłoki, które chcesz wykonać, gdy uruchomione polecenie zawiesi się. Nie sądzę, że kiedykolwiek tak naprawdę używałem tego od kilku dekad używania BSD Unix.
źródło