Warum druckt "echo abc ^ H" nicht einfach "ab"?

7

Soweit ich mich erinnere, ^Hbedeutet Backspace. Ich habe es durch Drücken von CTRL+V, CTRL+H.

Das ^Hsollte also das letzte Zeichen entfernen, da es dasselbe ist wie Backspaceund es sollte so tun, als ob ich Backspacean dieser Position gedrückt hätte.

Warum das nicht der Ausgang echo abc^Hbleiben abcund nicht ab?

Michael
quelle
^Hbedeutet "Cursor links eins".
Ignacio Vazquez-Abrams

Antworten:

17

backspace bewegt den Cursor nur rückwärts.

backspace(oder ein deletebeliebiges Zeichen, abhängig von der Konfiguration) löscht das zuletzt gedruckte Zeichen nur, wenn diese Bedingungen erfüllt sind:

  • Es wird auf der Tastatur eingegeben und nicht wie echoin Ihrem Beispiel ausgegeben
  • Das Endgerät befindet sich im gekochten Modus (der übliche Fall).

Wenn Sie das cin Ihrem Beispiel löschen möchten , müssen Sie es durch ein anderes Zeichen überschreiben, zum Beispiel:

echo "abc^H "
jlliagre
quelle
Übrigens echo "abc^H "hat es bei mir nicht einmal funktioniert echo -e "abc\b ". Ich kann nicht herausfinden, warum ^Hes nicht funktioniert. ps. Meine Shell ist Bash 4.1.5.
Eile
2
@ Rush: Stellen Sie sicher, dass Sie eingeben, ^Hindem Sie eingeben Ctrl-V,Ctrl-H
jlliagre
Technisch: Wenn der Kochmodus (im Treiber) oder etwas, das sich wie der Kochmodus verhält, wie z. B. Bash + Readline.
dave_thompson_085
0

Durch Eingabe von ^ V ^ H fügen Sie einen Backspace-Code in die Zeichenfolge ein, ohne einen Backspace-Befehl auszugeben. ^ H muss kein destruktiver Rückraum sein; Einige Software verwendet es zum Überdrucken.

Nachträglicher Gedanke: Die Ersteller von echo (1) haben argumentiert, dass Sie, wenn Sie ^ V und einen Steuercode eingeben, dies tun, weil Sie möchten, dass ein anderer Prozess, nicht echo (1), den Steuercode analysiert. Im Fall von Strg-H setzt echo (1) 0x08 in die Ausgabezeichenfolge und zeigt dies mit einem Caret und einem H. Wenn die Zeichenfolge zu etwas umgeleitet wird, das 0x08 als destruktiven Rückraum in seinem EINGANG PARSIERT, erhalten Sie möglicherweise das erwünschtes Ergebnis.

Dan Strychalski
quelle
Die akzeptierte Antwort sagt es bereits.
RalfFriedl
Echo (1) macht keines dieser Dinge; Der Terminaltreiber und / oder die Shell übergeben das Ergebnis (ein Byte mit dem Wert 0x08) an echo (1), das es wie jeden anderen Zeichencode ausgibt. In ähnlicher Weise können Sie in bash, ksh, zsh verwenden, $'\b'was die Shell in eine 0x08 konvertiert und an das Programm oder einen anderen Befehl übergibt.
dave_thompson_085
-2

stty erase ^H das sollte es lösen.

Jippie
quelle