In printf '%s\t%s\n' foo bar
, printf
gibt aus foo<TAB>bar<LF>
.
f
, o
, b
, a
Und r
sind einfach breite graphischen Zeichen.
Nach Erhalt dieser Zeichen zeigt das Terminal eine entsprechende Glyphe an und bewegt den Cursor eine Spalte nach rechts, es sei denn, er hat bereits den rechten Bildschirmrand erreicht (Papier in Original-Fernschreibmaschinen). In diesem Fall wird möglicherweise eine Zeile eingezogen und kehren Sie zum linken Bildschirmrand zurück (Wrap) oder verwerfen Sie das Zeichen je nach Terminal und Konfiguration.
<Tab>
und <LF>
sind zwei Steuerzeichen . <LF>
(auch bekannt als newline) ist das Zeilentrennzeichen in Unix-Text, aber bei Terminals wird nur eine Zeile eingezogen (bewegen Sie den Cursor eine Position nach unten). Der Terminaltreiber im Kernel übersetzt ihn also tatsächlich in <CR>
(Rückkehr zum linken Bildschirmrand) <LF>
(Cursor nach unten) ( stty onlcr
normalerweise standardmäßig aktiviert).
<Tab>
Weist das Terminal an, den Cursor zum nächsten Tabulator zu bewegen (der bei den meisten Terminals standardmäßig 8 Positionen voneinander entfernt ist, aber auch so konfiguriert werden kann, dass er überall eingestellt werden kann), ohne die Lücke mit Leerzeichen zu füllen.
Wenn diese Zeichen also alle 8 Spalten an ein Terminal mit Tabulatoren gesendet werden, während sich der Cursor am Anfang einer leeren Zeile befindet, führt dies zu:
foo bar
in dieser Zeile auf dem Bildschirm gedruckt. Wenn sie gesendet werden, während sich der Cursor an dritter Stelle in einer Zeile befindet xxxxyyyyzzzz
, die Folgendes enthält , führt dies zu:
xxfooyyybarz
Auf Terminals, die keine Tabellierung unterstützen, kann der Terminaltreiber so konfiguriert werden, dass diese Registerkarten in Leerzeichenfolgen übersetzt werden. ( stty tab3
).
Das SPC-Zeichen in Original-Fernschreibmaschinen würde den Cursor nach rechts bewegen, während die Rücktaste ( \b
) ihn nach links bewegen würde. In modernen Terminals bewegt sich SPC nach rechts und löscht auch (schreibt ein Leerzeichen, wie Sie es erwarten würden). Der Anhänger von \b
musste also etwas Neueres als ASCII sein. Auf den meisten modernen Terminals, es ist eigentlich eine Folge von Zeichen: <Esc>
, [
, C
.
Es gibt mehr Escape-Sequenzen, um n
Zeichen nach links, rechts, oben, unten oder an einer beliebigen Position auf dem Bildschirm zu bewegen . Es gibt andere Escape-Sequenzen, um Teile von Linien oder Bereichen des Bildschirms usw. zu löschen (mit Leerzeichen zu füllen).
Diese Sequenzen werden in der Regel durch visuelle Anwendungen wie vi
, lynx
, mutt
, dialog
wo Text an beliebigen Positionen auf dem Bildschirm geschrieben wird.
Mit allen X11-Terminalemulatoren und einigen anderen Nicht-X11-Emulatoren wie GNU können screen
Sie jetzt Bereiche des Bildschirms zum Kopieren und Einfügen auswählen. Wenn Sie einen Teil dessen auswählen, was Sie im vi
Editor sehen, möchten Sie nicht alle Escape-Sequenzen kopieren, die zur Erstellung dieser Ausgabe verwendet wurden. Sie möchten den dort angezeigten Text auswählen.
Zum Beispiel, wenn Sie ausführen:
printf 'abC\rAC\bB\t\e[C\b\bD\n'
Welche einen Editor Sitzung simuliert , wo Sie eingeben abC
, gehen Sie an den Anfang zurück, ersetzen ab
mit AC
, C
mit B
, Umzug in den nächsten Tabstopp, dann eine weitere Spalte nach rechts, dann zwei Spalten nach links, dann eingeben D
.
Sie sehen:
ABC D
Das heißt, ABC
eine Lücke von 4 Spalten und D
.
Wenn Sie dies mit der Maus in xterm
oder auswählen, putty
werden in der Auswahl ABC
4 Leerzeichen und D
nicht gespeichert abC<CR>AC<BS>B<Tab><Esc>[C<BS><BS>D
.
Was in der Auswahl endet, ist das, was printf
sowohl vom Terminaltreiber als auch vom Terminalemulator gesendet, aber nachbearbeitet wurde.
Für andere Arten der Transformation siehe die <U+0065><U+0301>
( e
gefolgt von einem kombinierten akuten Akzent) geändert in <U+00E9>
( é
die vorkomponierte Form) durch xterm
.
Oder echo abc
das wird ABC
vom Terminaltreiber übersetzt, bevor es nach a an das Terminal gesendet wird stty olcuc
.
Nun, <Tab>
wie <LF>
ist eines dieser wenigen Steuerzeichen, die tatsächlich manchmal in Textdateien gefunden werden (auch <CR>
in MSDOS-Textdateien und manchmal <FF>
für Seitenumbrüche).
Einige Terminalemulatoren kopieren sie daher nach Möglichkeit in die Puffer zum Kopieren und Einfügen, um sie zu erhalten (dies ist jedoch im Allgemeinen weder der Fall <CR>
noch der Fall <LF>
).
In VTE-basierten Terminals wie gnome-terminal
können Sie beispielsweise feststellen, dass bei Auswahl des Ausgangs printf 'a\tb\n'
in einer leeren Zeile gnome-terminal
tatsächlich 7 Leerzeichen und a\tb
in der X11-Auswahl a
gespeichert werden b
.
Aber für die Ausgabe printf 'a\t\bb\n'
, es speichert a
, 6 Räume und b
, und für printf 'a\r\tb\n'
, a
, 7 Räume und b
.
Es gibt andere Fälle, in denen die Terminals versuchen, die tatsächliche Eingabe zu kopieren, z. B. wenn Sie nach dem Ausführen zwei Zeilen auswählen, in printf 'a \nb\n'
denen dieser unsichtbare nachfolgende Speicherplatz erhalten bleibt. Oder wenn Sie zwei Zeilen auswählen, wird kein LF-Zeichen eingefügt, wenn die beiden Zeilen durch Umbrechen am rechten Rand entstehen.
Wenn Sie nun die Ausgabe von printf
in der CLIPBOARD- X11
Auswahl speichern möchten, tun Sie dies am besten direkt wie folgt mit:
printf 'foo\tbar\n' | xclip -sel c
Beachten Sie, dass , wenn Sie fügen , dass in den xterm
meisten anderen Terminals oder xterm
ersetzt eigentlich , dass \n
mit , \r
denn das ist das Zeichen xterm
sendet , wenn Sie drücken Enter(und der Terminal - Treiber kann es übersetzen zurück zu \n
).