Jak zasygnalizować koniec wejścia standardowego


82
  1. W Bash dowiedziałem się, że sygnał końcowy można zmienić tutaj. Ale jak domyślnie mogę sygnalizować koniec wejścia standardowego?
  2. Zdarzyło mi się, że w przypadku cat i chardet ich wejścia standardowe mogą być sygnalizowane jako zakończone przez Ctrl + d. Wydaje mi się jednak, że pamiętam, że Ctrl + d i Ctrl + c są podobne do zakończenia wykonywania uruchomionego polecenia. Więc się mylę?

Odpowiedzi:


114

Ctrl+D, po wpisaniu na początku linii na terminalu, oznacza koniec danych wejściowych. Nie jest to sygnał w sensie uniksowym: gdy aplikacja czyta z terminala, a użytkownik naciska Ctrl+D, aplikacja jest powiadamiana, że ​​osiągnięto koniec pliku (tak jak w przypadku odczytu z pliku i przekazania ostatni bajt).

Ctrl+Cwysyła sygnał, SIGINT . Domyślnie SIGINT (sygnał przerwania) zabija aplikację pierwszoplanową, ale aplikacja może przechwycić sygnał i zareagować w inny sposób (na przykład sama powłoka przechwytuje sygnał i przerywa linię, którą zacząłeś pisać, ale nie „ t exit, wyświetla nowy monit i czeka na nowy wiersz poleceń).

Można zmienić znaki związane z EOF i SIGINT z sttypoleceniem, np stty eof astałaby aznak EOF, a stty intr ^-byłoby wyłączyć charakter SIGINT. Jest to rzadko przydatne.


Dzięki! Czy Ctrl+Doznacza Ctrl i wielką literę D, czy to nie ma znaczenia?
Tim

5
@Tim: potrzebujesz małych liter ... Konwencja pisania poleceń klawiaturowych wielkimi literami pojawia się, ponieważ etykiety na klawiaturze są zawsze pisane wielkimi literami, a opisywana jest KLUCZOWA SEKWENCJA, a nie rzeczywisty kod znaków widziany przez program. Tak, czasami jest to mylące.
Caleb

@Caleb: Dzięki! Jak określić, że klucz jest w kapitale? Czy może jest kiedykolwiek taki przypadek?
Tim

@Tim Na terminalu kombinacje klawiszy Ctrl+Shift+Di Ctrl+Dwysyłają ten sam znak (znak numer 4, zwykle nazywany Ctrl+D).
Gilles

2
@Tim Terminal otrzymał Ctrl + D. Nie wysyła znaku do programu. Co się dzieje, gdy program odczytuje z terminala, terminal mówi mu „to jest koniec pliku”, tak samo jak wtedy, gdy program próbuje czytać po zakończeniu pliku dyskowego. Powłoka w ogóle nie jest zaangażowana.
Gilles,

23

Twój drugi punkt łączy w sobie dwie zupełnie różne rzeczy.

  • Ctrl + C wysyła sygnał zabicia do uruchomionego procesu.
  • Ctrl + D wysyła znak końca transmisji .

Szukasz tego drugiego.


7
Potencjalne zamieszanie: z punktu widzenia aplikacji nie jest wysyłany żaden rzeczywisty znak dla ^ D. Co oznacza, że ​​aplikacja nie odbiera tej postaci z read(2)wywołania systemowego.
ulidtko
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.