Frage von leumasme, 13

Was macht ^@ in der eingabeaufforderung aka cmd.exe?

Hey!
Ich habe grade ein bischen in der Kommandozeile rumprobiert und hab gemerkt das CMD bei manchen Kombinationen wie STRG und V oder STRG und Q fast immer ^zeichen also zb bei STRG und V " ^V" einfügt. Wenn man dann abdrückt nimmt CMD das als ein Smily oder einen Pfeil nach unten oder so an. Noch ok. Aber wenn ich STRG + 2 drücke erscheint " ^@ " und wenn ich dann abdrücke... Steht in der nächsten Zeile nur "Mehr?" und sonst nichts. kein C:\Users...> oder so, nein. Man kann jedoch trotzdem Befehle ausgeben indem man sie einfach dahinter schreibt. Sobald man abdrückt wird der Befehl ausgeführt und in der nächsten Zeile ist wieder alles normal. Was ist das?
LG
-leumasme

Antwort
von PWolff, 3

(Falls jemand anderes dies später liest: Es geht hier um die Zeichen, die mit Strg+Buchstabe eingegeben werden, also echte Steuerzeichen. Wenn das Caret-Zeichen ^ für sich eingegeben wird, dient es als Escape-Zeichen, d. h. das folgende Zeichen verliert seine besondere Bedeutung. Beispiel:

C:\Users\PWolff>echo ab^&cd
ab&cd

)

-----

Kurz gesagt: das ist das NULL-Zeichen - es stellt normalerweise das Ende einer Zeichenkette in C-Programmen und verwandten Datenmodellen dar.

Offensichtlich interpretiert die Shell (cmd.exe) das als eine unvollständige Kommandozeile, die noch zu ergänzen ist. Deshalb fragt sie nach, wie die Kommandozeile fortzusetzen ist.

Übrigens werden Zeichen auf derselben Zeile ignoriert, und du erhälst z. B. folgendes (Benutzereingaben fett):

C:\Users\PWolff>echo ab^@cd
Mehr? cd usw. usf.abcd usw. usf.

-----

Hintergründe:

Mit Caret-Zeichen (^) plus folgendem Buchstaben stellt ein Steuerzeichen dar. Schon seit DOS-Zeiten werden die meisten dieser Zeichen bei der Ausgabe auf dem Bildschirm als Symbole dargestellt. 

Die Herkunft dieser Steuerzeichen stammt noch aus der Zeit der Fernschreiber. Hier haben wir "Zeichen", die z. B. beim Empfänger eine Glocke anschlagen (BEL, 7, ^G), die für Wagenrücklauf (CR, 13, ^M) und Zeilenvorschub (LF, 10, ^J) stehen, Ende der Nachricht (ETX, 3, ^C) usw. stehen.

"Ende der Nachricht" dient bei Konsolenprogrammen heute noch als Abbruchaufforderung, wie du feststellen kannst, wenn du während der Eingabe einer Kommandozeile Strg+C drückst, oder auch wenn du länger laufende Programme ausführst (ping -n 20 gutefrage.net).

Tabulator (TAB, 9, ^I), Wagenrücklauf, Rückwärtslöschen (BS, 8, ^H) und ein paar andere lassen sich mit ihrer konsolenüblichen Bedeutung per STRG+Buchstabe eingeben. (Die Bedeutungen: Dateinamen ergänzen, Zeilenschaltung/Enter, Rückwärtslöschen)

Das Null-Zeichen (NUL, 0, ^@) soll vom Fernschreiber normalerweise ignoriert werden; bei vielen alten (und auch neuen, aber in diesem Punkt hoffnungslos veralteten) Datentypsystemen dient es als Textende-Markierung. (Heute bevorzugt man - nicht zuletzt aus Sicherheitsgründen - als Kopf einer Zeichenkette die Länge der Zeichenkette.)

Da DOS in C programmiert wurde, sind ein paar Merkmale dieser Sprache und seiner Datenstrukturen übernommen worden, u. a. anscheinend auch das Null-Zeichen.

Die ersten Windows-Versionen (bis 3.x) hatten DOS als Unterbau und von daher exakt dieselben Eigenschaften der Shell (damals COMMAND.COM). Bei der Entwicklung der neueren Windows-Versionen wurden etliche Marotten von damals weiter übernommen.

Du kannst die Steuerzeichen (außer NUL) übrigens auch mit Alt+Code eingeben - wobei dem Code eine 0 voranzustellen ist, damit Windows das Zeichen als ANSI-Symbol (Windows ab 95) und nicht als IBM-Symbol (DOS) interpretiert. Z. B. Glocke als Alt+[07], Zeilenschaltung als Alt+[013] usw.

Die heutigen Drucker wandeln alles in Grafik um; bei älteren Druckern, die zeichen- und zeilenweise gearbeitet haben, spielten diese Steuerzeichen noch eine Rolle. (Die heutigen Drucker kennen so viele Grafikbefehle, dass diese als mehrbuchstabige Worte gesendet werden; einzelne Zeichen reichen nicht mehr aus. Dafür gibt es druckereigene Sprachen und ein paar Universalsprachen wie PostScript und seine Weiterentwicklung PDF.)

(Danke übrigens, dass das NULL-Zeichen sich mit Strg+2 eingeben lässt, habe ich auch noch nicht gewusst.)

Kommentar von leumasme ,

Danke!

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten