Czy dosłownie „kończysz plik”, wprowadzając tę sekwencję zmiany znaczenia, tzn. Czy interaktywna sesja powłoki jest postrzegana przez powłokę jako rzeczywisty strumień plików, jak każdy inny strumień plików? Jeśli tak, to który plik?
Czy też sygnał Ctrl+ to Dtylko symbol zastępczy, co oznacza, że „użytkownik zakończył wprowadzanie danych i możesz zakończyć”?
shell
escape-characters
Geeb
źródło
źródło
set -o ignoreeof
zmienić to zachowanie.Odpowiedzi:
^D
Znaków (znany również jako\04
lub 0x4, Koniec transmisji w Unicode) jest wartością domyślną dlaeof
specjalnego parametru znak kontrolny terminalu lub sterownika pseudo-terminala w jądrze (a dokładniej ztty
dyscypliną linia dołączone do szeregowego lub pseudo- urządzenie tty ). Toc_cc[VEOF]
otermios
strukturze przekazywane do TCSETS / TCGETSioctl
jeden problemy z urządzeniem końcowym, aby wpływać na zachowanie kierowcy.Typowe polecenie, które je wysyła,
ioctls
tostty
polecenie.Aby pobrać wszystkie parametry:
Ten
eof
parametr jest istotny tylko wtedy, gdy urządzenie końcowe znajduje się wicanon
trybie.W tym trybie sterownik terminala (nie emulator terminala) implementuje bardzo prosty edytor linii , w którym można wpisać, Backspaceaby usunąć znak, Ctrl-Uaby usunąć całą linię ... Gdy aplikacja czyta z urządzenia końcowego, nie widzi nic, dopóki Naciśnięcie Returnw tym momencie
read()
zwraca pełną linię w tym ostatnimLF
znaku (domyślnie sterownik terminala przekłada się równieżCR
wysłana z terminala na ReturnceluLF
).Teraz, jeśli chcesz wysłać to, co do tej pory wpisałeś bez naciskania Enter, tam możesz wpisać
eof
znak. Po otrzymaniu tego znaku z emulatora terminala sterownik terminala przesyła bieżącą treść wiersza, aby aplikacja wykonującaread
go otrzymała go takim, jaki jest (i nie będzie zawierałaLF
znaku końcowego ).Teraz, jeśli bieżąca linia była pusta i pod warunkiem, że aplikacja będzie w pełni czytać wcześniej wprowadzone linie,
read
zwróci 0 znaków.Oznacza to koniec pliku dla aplikacji (kiedy czytasz z pliku, czytasz, dopóki nie będzie już nic więcej do odczytania). Dlatego nazywa się to
eof
znakiem, ponieważ wysłanie go powoduje, że aplikacja widzi, że nie ma już żadnych danych wejściowych.Teraz nowoczesne powłoki, po ich wyświetleniu, nie ustawiają terminala w
icanon
trybie, ponieważ implementują własny edytor linii, który jest znacznie bardziej zaawansowany niż wbudowany sterownik terminala. Jednak w swoim własnym edytorze liniowym , aby uniknąć mylenia użytkowników, nadają one^D
znakowi (lub jakiemukolwiek ustawieniu terminalaeof
jakieś znaczenie) temu samemu znaczeniu (oznaczaćeof
).źródło
CTRL_D to tylko sygnał informujący, że to koniec strumienia tekstowego. Nie kończysz na nim pliku, kończysz strumień wejściowy, wpisując go. CTRL_D nie oznacza żadnego znaku ani bajtu, jak można to sprawdzić za pomocą narzędzia hexdump:
źródło