![Bewirkt Bash, dass das Terminal einen Zeilenumbruch (\n) in einen Wagenrücklauf (\r) übersetzt?](https://rvso.com/image/111971/Bewirkt%20Bash%2C%20dass%20das%20Terminal%20einen%20Zeilenumbruch%20(%5Cn)%20in%20einen%20Wagenr%C3%BCcklauf%20(%5Cr)%20%C3%BCbersetzt%3F.png)
Ich habe zwei Terminals geöffnet und vom unteren Terminal aus Folgendes ausgeführt, cat
um vom oberen Terminal zu lesen:
Im obigen Terminal gebe ich ein "Hello World<Enter>Bye"
, aber es sieht so aus, als ob das obige Terminal die Enter
Taste als Wagenrücklauf ( \r
) gesendet hat.
Ändert man also bash
die Einstellungen des Terminals, um eine neue Zeile ( \n
) in einen Wagenrücklauf ( \r
) zu übersetzen?
Antwort1
Bash hat das Terminal in den „Raw“-Modus geändert, was bedeutet, dass getippte Zeichen in keiner Weise verarbeitet werden. Die Eingabetaste erzeugt ein Wagenrücklaufzeichen (\r), keinen Zeilenvorschub (\n), sodass keine Übersetzung stattfindet.
Antwort2
rohUndgekochtModi sind beschreibende Begriffe. stty raw
Verwendet andere Einstellungen als Bash.
Bash führt die Terminalinitialisierung inTerminaleinstellungen vorbereiten(eine interne Funktion der Readline-Bibliothek) zum Einstellen des Terminalmodus, um das Lesen einzelner Zeichen ohne Echo zu ermöglichen:
tiop->c_lflag &= ~(ICANON | ECHO);
Die Wagenrücklaufübersetzung wird jedoch in einemanderer Teil der Funktion:
/* Make sure we differentiate between CR and NL on input. */
tiop->c_iflag &= ~(ICRNL | INLCR);
Vergleicht man prepare_terminal_settings
mit demKernel-Dienstprogrammestty
, letzteres bewirkt weniger (mehrere Punkte, aber Bash setzt INLCR
auch zurück):
sonst wenn (STREQ (info->name, "roh") || STREQ (info->name, "gekocht")) { wenn ((info->name[0] == 'r' && umgekehrt) || (info->name[0] == 'c' && !umgekehrt)) { /* Gekochter Modus. */ Modus->c_iflag |= BRKINT | IGNPAR | ISTRIP | ICRNL | IXON; Modus->c_oflag |= OPOST; Modus->c_lflag |= ISIG | ICANON; #wenn VMIN == VEOF Modus->c_cc[VEOF] = CEOF; #endif #wenn VTIME == VEOL Modus->c_cc[VEOL] = CEOL; #endif } anders { /* Raw-Modus. */ Modus->c_iflag = 0; Modus->c_oflag &= ~OPOST; Modus->c_lflag &= ~(ISIG | ICANON #ifdef XCASE