Unix / Linux EOL ist LF, Zeilenvorschub, ASCII 10, Escape-Sequenz \n
.
Hier ist ein Python-Snippet, um genau einen Tastendruck zu erhalten:
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
Wenn ich als EnterAntwort auf dieses Snippet auf meiner Tastatur drücke , gibt es \r
Wagenrücklauf, ASCII 13.
Unter Windows wird Entergesendet CR LF == 13 10
. * nix ist nicht Windows; Warum gibt Enteres 13 statt 10?
command-line
terminal
newlines
ascii
Katze
quelle
quelle
Antworten:
Während die Antwort von Thomas Dickey ganz richtig ist, hat Stéphane Chazelas in einem Kommentar zu Dickeys Antwort richtig erwähnt, dass die Bekehrung nicht in Stein gemeißelt ist; Es ist Teil der Liniendisziplin.
Tatsächlich ist die Übersetzung vollständig programmierbar.
Die man 3 termios- Manpage enthält grundsätzlich alle relevanten Informationen. (Der Link führt zu einem Linux-Handbuchprojekt , in dem angegeben ist, welche Funktionen nur für Linux gelten und welche für POSIX- oder andere Systeme gleich sind. Überprüfen Sie dort immer den Abschnitt Übereinstimmung mit auf jeder Seite.)
Die
iflag
Terminalattribute (old_settings[0]
in dem in der Frage in Python gezeigten Code ) weisen auf allen POSIXy-Systemen drei relevante Flags auf:INLCR
: Falls gesetzt, NL bei der Eingabe in CR übersetzenICRNL
: Wenn gesetzt (undIGNCR
nicht gesetzt), wird CR bei der Eingabe in NL übersetztIGNCR
: CR bei der Eingabe ignorierenEbenso gibt es auch verwandte Ausgabeeinstellungen (
old_settings[1]
):OPOST
: Aktiviert die Ausgabeverarbeitung.OCRNL
: CR auf NL bei der Ausgabe abbilden.ONLCR
: Bei der Ausgabe NL auf CR abbilden. (XSI; nicht in allen POSIX- oder Single-Unix-Spezifikationssystemen verfügbar.)ONOCR
: CR in der ersten Spalte überspringen (nicht ausgeben).ONLRET
: CR überspringen (nicht ausgeben).Sie könnten beispielsweise vermeiden, sich auf das
tty
Modul zu verlassen. Die "makeraw" -Operation löscht nur eine Reihe von Flags (und setzt dieCS8
oflag):Aus Kompatibilitätsgründen sollten Sie jedoch zunächst prüfen, ob alle diese Konstanten im Modul termios vorhanden sind (wenn Sie auf Nicht-POSIX-Systemen ausgeführt werden). Sie können auch mit
new_settings[6][termios.VMIN]
undnew_settings[6][termios.VTIME]
festlegen, ob und wie lange ein Lesevorgang blockiert werden soll, wenn keine Daten anstehen (in ganzzahligen Anzahl von Entscheidungssekunden). ( Wird normalerweiseVMIN
auf 0 undVTIME
auf 0 gesetzt, wenn Lesevorgänge sofort zurückgegeben werden sollen, oder auf eine positive Zahl (Zehntelsekunden), wie lange der Lesevorgang höchstens warten soll.)Wie Sie sehen können, deaktivieren die obigen (und "Makeraw" im Allgemeinen) alle Übersetzungen bei der Eingabe, was das Verhalten erklärt, das Katze sieht:
Um ein normales Verhalten zu erzielen, lassen Sie die Zeilen weg, die diese drei Zeilen löschen, und die Eingabeübersetzung bleibt auch bei "roh" unverändert.
Die
new_settings[1] = new_settings[1] & ~termios.OPOST
Zeile deaktiviert die gesamte Ausgabeverarbeitung, unabhängig davon, was die anderen Ausgabe-Flags sagen. Sie können es einfach weglassen, um die Ausgabeverarbeitung intakt zu halten. Dadurch bleibt die Ausgabe auch im Raw-Modus "normal". (Es hat keinen Einfluss darauf, ob die Eingabe automatisch wiedergegeben wird oder nicht.ECHO
Dies wird durch das Flag in gesteuertnew_settings[3]
.)Wenn neue Attribute festgelegt werden, ist der Aufruf erfolgreich, wenn eine der neuen Einstellungen festgelegt wurde. Wenn die Einstellungen vertraulich sind - beispielsweise wenn Sie in der Befehlszeile nach einem Kennwort fragen -, sollten Sie die neuen Einstellungen abrufen und sicherstellen, dass die wichtigen Flags richtig gesetzt / nicht gesetzt sind.
Wenn Sie Ihre aktuellen Terminaleinstellungen anzeigen möchten, führen Sie aus
Die Eingabe-Flags befinden sich normalerweise in der vierten Zeile und die Ausgabe-Flags in der fünften Zeile, wobei
-
dem Flag-Namen ein vorangestellt wird, wenn das Flag nicht gesetzt ist. Beispielsweise könnte die Ausgabe seinBei Pseudoterminals und USB-TTY-Geräten spielt die Baudrate keine Rolle.
Wenn Sie Bash-Skripte schreiben, die z. B. Passwörter lesen möchten, berücksichtigen Sie die folgende Redewendung:
Die
EXIT
Trap wird ausgeführt, wenn die Shell beendet wird. Derstty -g
liest die aktuellen Einstellungen des Terminals zu Beginn des Skripts, sodass die aktuellen Einstellungen beim Beenden des Skripts automatisch wiederhergestellt werden. Sie können das Skript sogar mit Ctrl+ unterbrechen C, und es wird das Richtige tun. (In einigen Eckfällen mit Signalen habe ich festgestellt, dass das Terminal manchmal mit den rohen / nicht-kanonischen Einstellungen feststeckt (es mussreset
+ Enterblind am Terminal eingegeben werden), aberstty sane
vor dem Wiederherstellen der tatsächlichen ursprünglichen Einstellungen wurde dies jedes Mal behoben Ich. Deshalb ist es da, eine Art zusätzliche Sicherheit.)Sie können Eingabezeilen (die nicht an das Terminal gesendet wurden) mit der integrierten
read
Bash-Funktion lesen oder die Eingabe sogar zeichenweise mit der Funktion lesenWenn Sie nicht
IFS
auf ASCII NUL setzen,read
werden die Trennzeichen von der integrierten Funktion verbraucht, sodassc
sie leer sind. Falle für junge Spieler.quelle
Im Wesentlichen "weil es seit manuellen Schreibmaschinen so gemacht wird". Ja wirklich.
Eine manuelle Schreibmaschine hatte einen Wagen, in den das Papier eingezogen wurde, und bewegte sich vorwärts, während Sie tippten (Laden einer Feder), und hatte einen Hebel oder Schlüssel, der den Wagen freigab, wodurch die Feder den Wagen zum linken Rand zurückbringen ließ.
Mit der Einführung der elektronischen Dateneingabe (Fernschreiben usw.) wurde dies fortgeführt. So würde der EnterSchlüssel auf vielen Terminals beschriftet sein Return.
Zeilenvorschübe erfolgten (im manuellen Verfahren), nachdem der Wagen wieder am linken Rand positioniert wurde. Wiederum ahmten die elektronischen Geräte die manuellen Geräte nach und führten eine separate line-feedOperation durch.
Beide Operationen sind codiert (damit der Teletyp mehr als ein eigenständiges Gerät ist, das einen Papiertyp erstellt). Wir haben also
CR
(Wagenrücklauf) undLF
(Zeilenvorschub). Dieses Bild aus ASR 33 Teletype Information zeigt die Tastatur mitReturn
auf der rechten Seite undLine-Feed
direkt auf der linken Seite. Auf der rechten Seite zu sein , war der Hauptschlüssel:Unix kam später vorbei. Die Entwickler wollten Dinge verkürzen (schauen Sie sich alle Abkürzungen an, auch
creat
für "create"). Angesichts eines möglicherweise zweiteiligen Prozesses entschieden sie, dass Zeilenvorschübe nur Sinn machten, wenn ihnen Wagenrückläufe vorausgingen. Sie haben also die expliziten Zeilenumbrüche aus Dateien gelöschtReturn Zeilenumbrüche und den Schlüssel des Terminals übersetzt , um den entsprechenden Zeilenvorschub zu senden. Um Verwirrung zu vermeiden, wurde der Zeilenvorschub als "Zeilenvorschub" bezeichnet.Wenn Sie Text auf das Terminal schreiben, übersetzt Unix in die andere Richtung: Ein Zeilenvorschub wird zum Wagenrücklauf / Zeilenvorschub.
(Das heißt, "normal": sogenannter "gekochter Modus", im Gegensatz zum "rohen" Modus, in dem keine Übersetzung erfolgt).
Zusammenfassung:
quelle
LF
in die übersetzt wirdCR LF
. Wenn Siefoo<Return>
im gekochten Modus tippen , liest die Anwendungfoo\n
undfoo\r\n
wird von der Zeilendisziplin zurückgesendet, damit das Echo an das Terminal gesendet wird.