mit der Geschichte lesen

11

Wie kann ich den integrierten readBefehlsunterstützungsverlauf erstellen , indem ich die Auf- / Ab-Taste drücke , um ihn zu durchlaufen?

Ich habe versucht zu fangen, wenn Sie die Aufwärts-Taste drücken, aber es scheint nicht zu funktionieren mit read:

read -p '> ' -n 3 foo
echo
echo -n "$foo" | hexdump

Das Drücken der Pfeiltasten scheint zu funktionieren und ich kann es damit erkennen. Wenn ich jedoch drücke aa, schlägt dies fehl, da nur das erste Zeichen der Kennung des Aufwärtspfeils gelesen wird, während das dritte Zeichen zur Unterscheidung der verschiedenen Pfeile benötigt wird Schlüssel.

Tyilo
quelle

Antworten:

8

Sie können rlwrapdies verwenden, wenn Sie nichts dagegen haben, Software zu installieren.

Möglicherweise möchten Sie eine separate Verlaufsdatei aufbewahren, in der nur der Verlauf für die jeweilige Eingabeaufforderung in Ihrem Skript verwaltet wird (dh vermeiden Sie das Mischen mit dem Shell-Befehlsverlauf des Benutzers).

Hier ist ein Beispiel, das für Sie funktionieren könnte:

#!/bin/sh
# Save in rlwrap_example.sh

HISTORY=$HOME/.myscript_history
USERINPUT=$(rlwrap -H $HISTORY sh -c 'read REPLY && echo $REPLY')
echo "User said $USERINPUT"

$ ./rlwrap_example.sh
hello
User said hello

Im obigen Skript kann der Benutzer alle GNU-Readline- Funktionen verwenden, wobei der Verlauf von - bereitgestellt und in - gespeichert wird  ~/.myscript_history. Nach Bedarf anpassen.

Alternativ können Sie Bashs verwenden read -e, die Readline für Aufrufe readaktivieren, aber die Verlaufsfunktionalität ist wahrscheinlich zu eingeschränkt (dh fast nicht vorhanden).

mrb
quelle
10

Um Mike Stroyans großartige Antwort von diesem alten Mailinglisten-Beitrag zu kopieren :

Sie können "history -r" verwenden, um eine Datei in den Verlauf der Shell einzulesen, und "history -s", um jede Zeile, die Sie in den Verlauf einlesen, hinzuzufügen. Verwenden Sie dann history -w, um den Verlauf wieder in der Datei zu speichern. Hier ist ein Beispiel für die Bearbeitung von Readline im vi-Stil.

#!/bin/bash
history -r script_history
set -o vi
CMD=""
while true
do
    echo "Type something"
    read -e CMD
    history -s "$CMD"
    echo "You typed $CMD"
    case "$CMD" in
        stop)
            break
            ;;
        history)
            history
            ;;
    esac
done
history -w script_history
echo stopping
Chris Pacejo
quelle
Diese Lösung gefällt mir besser, als rlwrapda (zumindest auf meinem Computer) rlwrapSTRG-C nicht ordnungsgemäß verarbeitet werden kann. Versuchen USERINPUT=$(rlwrap -o cat)Sie beispielsweise, STRG-C auszuführen und zu drücken, und sehen Sie, wie sich Ihr Terminal anschließend verhält (führen Sie den resetBefehl aus, um wieder in einen normalen Zustand zurückzukehren). .
Zpon
Dies funktioniert sehr gut, wenn Sie keine zusätzlichen Bibliotheken installieren möchten und gerne eine separate Datei zum Verwalten der Eingabe verwenden.
Luke Exton