Ich führe ein sehr einfaches Skript aus, das Zeile für Zeile liest und die eingegebene Zeile zurück zum Terminal druckt:
while read CMD; do
echo $CMD
done
Es funktioniert gut, aber wenn ich versuche, eine Zeile mit einem backspace
Zeichen zu bearbeiten, wird es gedruckt, ^?
anstatt ein Zeichen zu löschen. Und wenn ich Ctrl
+ drücke, ist backspace
der Ausgang ^H
. Wie kann dieses Verhalten behoben werden, um backspace
Zeichen zu entfernen, anstatt diese Zeichen hinzuzufügen? Ich habe versucht, stty erase '^?'
Befehl, aber nicht erfolgreich.
command-line
bash
vrom911
quelle
quelle
read CMD
durch zu ersetzenread -e CMD
.terminator
stattgnome-terminal
. Es funktioniert wie erwartet-e
Option. Auf dem Computer von @ vrom911 ist dies jedoch nicht der Fall. Ich frage mich, warum es passiert und wo dies konfiguriert werden kann.Antworten:
Das Problem ist, dass es viele Möglichkeiten gibt, eine Rücktaste darzustellen, aber der
read
Befehl versteht nicht alle. Sie sollten in der Lage sein, zu konfigurieren, was genau gesendet wird, wenn Sie die ← BackspaceTaste in den Einstellungen Ihres Terminalemulators drücken .Angenommen, Sie verwenden
gnome-terminal
als Emulator, öffnen Sie das Bearbeitungsmenü und klicken Sie auf Profileinstellungen . Wechseln Sie zur Registerkarte Kompatibilität, und Sie sollten folgende Optionen erhalten:Jetzt können Sie die Rücktaste ändern, die generiert wird: Einstellung. Sie haben die folgenden fünf Optionen zur Auswahl. Ich habe in geschweiften Klammern hinzugefügt, wie sie sich auf meinem System verhalten:
^H
stattdessen)^[[3~
stattdessen)quelle
type read
sagt und welche Shell / Versionsberichte$SHELL --version
?type read
sagtread is a shell builtin
. und$SHELL --version
sagtGNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
Ich hatte das gleiche Problem mit Bash im Gnome-Terminal.
Beachten Sie, dass in der Befehlszeile die Rücktaste wie erwartet funktioniert, aber wenn mein Programm (ein einfacher Chat-Client auf TCP-Socket-Basis) von stdin liest, wird das
backspace
Zeichen gedruckt (es wird wieder auf dem Bildschirm angezeigt),^?
anstatt das letzte Zeichen zu löschen.Verwenden Sie
# stty icanon
diese Option , um den "kanonischen (gekochten) Modus" zuzulassen. Eine Erklärung finden Sie hier /unix/131105/how-to-read-over-4k-input-without-new-lines-on-a-terminalNoch mehr Hintergrundinformationen zu meinem Problem / meiner Lösung: Ich hatte ein Problem, bei dem ich mehr als 4k Zeichen einfügen musste. Und während dieser Recherche wurde ich zu dem obigen Link geführt. Früher habe ich
# stty -icanon
das 4k-Limit deaktiviert, aber die Möglichkeit zur Verwendung der Rücktaste (Löschen) verloren.quelle