Die Rücktaste funktioniert nicht, wenn das Bash-Skript ausgeführt wird

8

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 backspaceZeichen zu bearbeiten, wird es gedruckt, ^?anstatt ein Zeichen zu löschen. Und wenn ich Ctrl+ drücke, ist backspaceder Ausgang ^H. Wie kann dieses Verhalten behoben werden, um backspaceZeichen zu entfernen, anstatt diese Zeichen hinzuzufügen? Ich habe versucht, stty erase '^?'Befehl, aber nicht erfolgreich.

vrom911
quelle
Bitte beachten Sie, dass 16.10 im letzten Monat das Ende seines Support-Zyklus erreicht hat. Sie sollten so schnell wie möglich auf 17.04 aktualisieren.
Byte Commander
1
Ich schlage vor, read CMDdurch zu ersetzen read -e CMD.
Cyrus
1
versuche terminatorstatt gnome-terminal. Es funktioniert wie erwartet
Severus Tux
1
@whtyger das hat bei diesem Skript funktioniert. In meiner realen Situation habe ich Eingaben von einem Programm, das nicht read aufruft. Ich habe keine Möglichkeit, das Programmskript zu ändern. Dies war nur ein Beispiel, das mein Problem darstellte. Gibt es globale Einstellungen, in denen ich diese Konfigurationen für alle Eingaben vornehmen lassen kann?
vrom911
1
@Cyrus My Backspace funktioniert wie ich will - es löscht immer das letzte Zeichen, auch für dieses Skript aus der Frage ohne -eOption. Auf dem Computer von @ vrom911 ist dies jedoch nicht der Fall. Ich frage mich, warum es passiert und wo dies konfiguriert werden kann.
Shersh

Antworten:

6

Das Problem ist, dass es viele Möglichkeiten gibt, eine Rücktaste darzustellen, aber der readBefehl 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-terminalals Emulator, öffnen Sie das Bearbeitungsmenü und klicken Sie auf Profileinstellungen . Wechseln Sie zur Registerkarte Kompatibilität, und Sie sollten folgende Optionen erhalten:

gnome-terminal → Profileinstellungen → Kompatibilität

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:

  • Automatisch (funktioniert)
  • Strg-H (druckt ^Hstattdessen)
  • ASCII DEL (Standard, funktioniert)
  • Escape-Sequenz (druckt ^[[3~stattdessen)
  • TTY Erase (funktioniert)
Byte Commander
quelle
Derzeit habe ich ASCII DEL. Ich habe alle 5 Optionen ausprobiert, aber keine davon hat das Problem behoben.
vrom911
Das ist komisch. Kannst du mir sagen, was type readsagt und welche Shell / Versionsberichte $SHELL --version?
Byte Commander
Ich weiß, dass es seltsam ist. Ich habe viel versucht, mein Problem zu googeln, aber keine Lösung gefunden, die für mich funktioniert. type readsagt read is a shell builtin. und $SHELL --versionsagtGNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
vrom911
1

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 backspaceZeichen gedruckt (es wird wieder auf dem Bildschirm angezeigt), ^?anstatt das letzte Zeichen zu löschen.

Verwenden Sie # stty icanondiese 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-terminal

Noch 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 -icanondas 4k-Limit deaktiviert, aber die Möglichkeit zur Verwendung der Rücktaste (Löschen) verloren.

Roger
quelle