EOL Unix / Linux to LF, linefeed, ASCII 10, sekwencja zmiany znaczenia \n
.
Oto fragment kodu w języku Python, aby uzyskać dokładnie jedno naciśnięcie klawisza:
import sys, tty, termios
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
Kiedy naciskam Enterklawiaturę w odpowiedzi na ten fragment \r
kodu , daje znak powrotu karetki, ASCII 13.
Na systemie Windows , Enterwysyła CR LF == 13 10
. * nix nie jest systemem Windows; dlaczego Enterdaje 13 zamiast 10?
Odpowiedzi:
Chociaż odpowiedź Thomasa Dickeya jest całkiem poprawna, Stéphane Chazelas słusznie wspomniał w komentarzu do odpowiedzi Dickeya, że nawrócenie nie jest ugruntowane; jest częścią dyscypliny liniowej.
W rzeczywistości tłumaczenie jest całkowicie programowalne.
Man 3 termios strona podręcznika zawiera w zasadzie wszystkie istotne informacje. (Odsyłacz prowadzi do projektu stron podręcznika systemu Linux , w którym wspomniano, które funkcje są dostępne tylko w systemie Linux i które są wspólne dla POSIX lub innych systemów; zawsze sprawdź tam sekcję Zgodność z na każdej stronie).
Te
iflag
atrybuty terminali (old_settings[0]
w kodzie przedstawionym w pytaniu w Pythonie ) ma trzy odpowiednie flagi na wszystkich systemach POSIXy:INLCR
: Jeśli jest ustawiony, przetłumacz NL na CR na wejściuICRNL
: Jeśli jest ustawiony (iIGNCR
nie jest ustawiony), przetłumacz CR na NL na wejściuIGNCR
: Zignoruj CR na wejściuPodobnie istnieją również powiązane ustawienia wyjściowe (
old_settings[1]
):OPOST
: Włącz przetwarzanie wyjściowe.OCRNL
: Mapuj CR na NL na wyjściu.ONLCR
: Mapuj NL na CR na wyjściu. (XSI; nie jest dostępny we wszystkich systemach POSIX lub Single-Unix-Specification.)ONOCR
: Pomiń (nie wysyłaj) CR w pierwszej kolumnie.ONLRET
: Pomiń (nie wysyłaj) CR.Na przykład możesz uniknąć polegania na
tty
module. Operacja „makeraw” po prostu usuwa zestaw flag (i ustawiaCS8
oflag):chociaż ze względu na kompatybilność, możesz najpierw sprawdzić, czy wszystkie te stałe istnieją w module termios (jeśli działasz na systemach innych niż POSIX). Możesz także użyć
new_settings[6][termios.VMIN]
i,new_settings[6][termios.VTIME]
aby ustawić, czy odczyt będzie blokowany, jeśli nie ma żadnych oczekujących danych, i jak długo (w liczbach całkowitych w decisekundach). (ZazwyczajVMIN
jest ustawiony na 0 iVTIME
na 0, jeśli odczyty powinny natychmiast powrócić, lub do liczby dodatniej (dziesiąta sekunda), jak długo odczyt powinien czekać najwyżej.)Jak widać powyższe (i ogólnie „ekspresaw”) wyłącza wszystkie tłumaczenia na wejściu, co wyjaśnia zachowanie, które widzi cat:
Aby uzyskać normalne zachowanie, po prostu pomiń wiersze usuwające te trzy wiersze, a tłumaczenie wejściowe pozostanie niezmienione, nawet gdy „surowe”.
new_settings[1] = new_settings[1] & ~termios.OPOST
Linia wyłącza wszystkie wyjścia przetwarzania, niezależnie co inne flagi wyjściowe powiedzieć. Możesz to pominąć, aby zachować nienaruszone przetwarzanie danych wyjściowych. Dzięki temu wyjście jest „normalne”, nawet w trybie surowym. (Nie wpływa to na to, czy sygnał wejściowy jest automatycznie powtarzany, czy nie; jest to kontrolowane przezECHO
cflag innew_settings[3]
.)Na koniec, gdy zostaną ustawione nowe atrybuty, połączenie zakończy się powodzeniem, jeśli zostaną ustawione jakiekolwiek nowe ustawienia. Jeśli ustawienia są wrażliwe - na przykład, jeśli pytasz o hasło w wierszu poleceń - powinieneś uzyskać nowe ustawienia i upewnić się, że ważne flagi są poprawnie ustawione / wyłączone.
Jeśli chcesz zobaczyć swoje aktualne ustawienia terminala, uruchom
Flagi wejściowe są zwykle w czwartym wierszu, a flagi wyjściowe w piątym wierszu, z
-
poprzedzającą nazwą flagi, jeśli flaga jest rozbrojona. Na przykład dane wyjściowe mogą byćNa pseudoterminalach i urządzeniach USB TTY szybkość transmisji jest nieistotna.
Jeśli piszesz skrypty Bash, które chcą czytać np. Hasła, rozważ następujący idiom:
EXIT
Pułapka jest wykonywany, gdy powłoka wychodzi.stty -g
Odczytuje aktualne ustawienia terminal na początku skryptu, więc obecne ustawienia są przywracane po wyjściu skrypcie automatycznie. Możesz nawet przerwać skrypt za pomocą Ctrl+ C, a zrobi to dobrze. (W niektórych narożnych przypadkach z sygnałami stwierdziłem, że terminal czasami blokuje się w ustawieniach surowych / niekanonicznych (wymaga wpisaniareset
+ na Enterślepo w terminalu), ale uruchomieniestty sane
przed przywróceniem faktycznych ustawień wyleczyło to za każdym razem ja. To dlatego tam jest; coś w rodzaju dodatkowego bezpieczeństwa.)Możesz czytać wiersze wejściowe (niezwiązane z terminalem) za pomocą
read
wbudowanego bash, a nawet czytać dane wejściowe znak po znaku za pomocąJeśli nie ustawisz
IFS
ASCII NUL,read
wbudowane zużyją separatory, więcc
będą puste. Pułapka dla młodych graczy.źródło
Zasadniczo „ponieważ zrobiono to w ten sposób od ręcznych maszyn do pisania”. Naprawdę.
Ręczna maszyna do pisania miała karetkę, na której podawano papier, i poruszała się do przodu podczas pisania (ładowanie sprężyny), i miała dźwignię lub klucz, który zwalniałby karetkę, pozwalając sprężynie powrócić karetkę do lewego marginesu.
Gdy wprowadzono elektroniczne wprowadzanie danych (teletyp itp.), Posunięto je dalej. Tak więc Enterklucz na wielu terminalach byłby oznaczony Return.
Wprowadzanie linii nastąpiło (w procesie ręcznym) po przywróceniu karetki do lewego marginesu. Ponownie urządzenia elektroniczne imitowały urządzenia ręczne, wykonując osobną line-feedoperację.
Obie operacje są zakodowane (aby pozwolić, aby typ teletekstu był czymś więcej niż samodzielnym urządzeniem tworzącym typ papieru), więc mamy
CR
(powrót karetki) iLF
(przesunięcie wiersza). Ten obraz z ASR 33 Teletype Information pokazuje klawiaturę,Return
po prawej stronie iLine-Feed
po lewej stronie. Będąc po prawej stronie , był to główny klucz:Unix pojawił się później. Jego twórcy lubili skracać rzeczy (spójrz na wszystkie skróty, nawet
creat
„twórz”). W obliczu prawdopodobnie dwuczęściowego procesu zdecydowali, że przesuwanie wiersza ma sens tylko wtedy, gdy poprzedza je powrót karetki. Usunęli więc jawne zwroty karetki z plików i przetłumaczyli Returnklucz terminala, aby wysłać odpowiedni znak wiersza. Aby uniknąć nieporozumień, określali wiersz jako „nowy wiersz”.Podczas pisania tekstu na terminalu Unix tłumaczy w innym kierunku: znak wiersza staje się znakiem powrotu karetki / znakiem wiersza.
(To znaczy „normalnie”: tak zwany „tryb gotowany”, w przeciwieństwie do trybu „surowego”, w którym nie wykonuje się tłumaczenia).
Streszczenie:
źródło
LF
jest tłumaczoneCR LF
. Gdy piszeszfoo<Return>
w trybie gotowym, aplikacja odczytujefoo\n
ifoo\r\n
jest wysyłana z powrotem przez dyscyplinę liniową w celu wykonania echa do terminala.