Dies ist eine Bitte um Erklärung oder einen Verweis auf die Dokumentation.
Ich bin ein KornShell93-Benutzer ( ksh
unter Mac OS X oder ksh93
anderswo). Ich mag die Shell wegen ihrer relativen Einfachheit als interaktive Shell und wegen ihrer Skriptfunktionen und verwende sie, seit der Code im Jahr 2000 freier gemacht wurde. Ich verwende sie im Bearbeitungsmodus vi
, wobei sowohl die Optionen vi
als auch viraw
festgelegt sind.
Es gibt eine nette Funktion, mit ksh93
der Sie mit der Eingabe eines Befehls in der Befehlszeile beginnen und dann drücken können, Up-arrowum die neueste passende Befehlszeile aus dem Befehlszeilenverlauf abzurufen. Ich kann die Dokumentation dazu und die Verknüpfung problemlos [count][A
im vi
Bearbeitungsmodus finden.
Wenn ich jedoch Up-arrowbei einer leeren Eingabeaufforderung drücke, wird mir zuerst der zuletzt ausgeführte Befehl angezeigt und dann beginnt es, den Befehlspräfix durchzugehen, nach dem ich zuvor gesucht habe. Das nervt mich unendlich.
Beispiel:
Ich führe diese drei Befehle aus:
$ ls -l
$ ls -ld test
$ ls -ld testdir
Durch dreimaliges Eintippen ls
und Drücken Up-arrowwerden sie in umgekehrter Reihenfolge durchlaufen.
Später wurden viele weitere Befehle ausgegeben, aber es wurden weder Verlaufssuchen durchgeführt noch ls
Aufrufe ausgeführt:
$ cc -o testrun mytest.c
$ man strncmp
Wenn ich jetzt Up-arroweinmal drücke, erhalte ich man strncmp
. Wenn ich Up-arrowerneut drücke, erhalte ich ls -ld testdir
und dann ls -ld test
anstelle des Befehls cc -o testrun mytest.c
und dann des vorherigen davor.
Ich suche nach Hinweisen, wie man das „beheben“ kann, sodass man Up-arrowohne vorherige Eingabe in der Befehlszeile den aktuellsten Verlauf durchläuft, ohne nach einem zuvor verwendeten Präfix suchen zu müssen. Sogar ein Hinweis auf eine Stelle, an der das obige Verhalten dokumentiert ist, wäre nett.
BEARBEITEN:
Im ksh93
Handbuch steht
[count]k
Vorherigen Befehl abrufen. Bei jederk
Eingabe wird auf den vorherigen Befehl zugegriffen.
/string
Durchsuchen Sie den Verlauf rückwärts nach einem vorherigen Befehl, der enthältstring
. wird durch ein oderString
beendet . Wenn ein vorangestellt ist , muss die übereinstimmende Zeile mit beginnen . Wenn null ist, wird das vorherige verwendet.RETURN
NEW LINE
string
^
string
string
string
[count][A
Wenn der Cursor am Ende der Zeile steht, ist dies gleichbedeutend mit ,/
wobeistring
der Inhalt der aktuellen Zeile gesetzt wird. Andernfalls ist dies gleichbedeutend mitk
.
Das machtnichterklären, warum ichErsteget man strncmp
(als ob Sie drücken würden k) undDannls -ld testdir
in meinem obigen Beispiel. Wenn ich den Text des Handbuchs im Hinterkopf behalte, würde ich erwarten, dass ich beim ls -ld testdir
ersten Drücken von Up-arrow(was übrigens noch ärgerlicher wäre) bekomme.
Antwort1
Es stellt sich heraus, dass es sich um dokumentiertes Verhalten handelt. Aus der Manpage von ksh93:
Befehle zum Suchen und Bearbeiten. Diese Befehle greifen auf Ihren Befehlsverlauf zu.
[count]k
Vorherigen Befehl abrufen. Bei jeder Eingabe von „k“ wird auf den vorherigen Befehl zugegriffen.
[count]-
Entspricht k.
[count][A
Wenn der Cursor am Ende der Zeile steht, ist dies gleichbedeutend/
mitSchnurauf den Inhalt der aktuellen Zeile gesetzt. Andernfalls ist es gleichwertig mitk
.
[count]j
Nächsten Befehl abrufen. Bei jeder Eingabej
wird auf den zeitlich nächsten Befehl zugegriffen.
/
Schnur Durchsuchen Sie den Verlauf rückwärts nach einem vorherigen Befehl, der Folgendes enthält:Schnur. Zeichenfolgewird durch eineRETURN' or
NEW LINE' beendet. WennSchnurist ein vorangestellt^
, die übereinstimmende Zeile muss mit beginnenSchnur. WennSchnurist null, die vorherige Zeichenfolge wird verwendet.
Hinweis: Wenn Sie nach der Eingabe einer Zeichenfolge die Pfeiltaste nach oben verwenden, wird die Suchzeichenfolgeverankertan den Zeilenanfang, als ob ^
es davor getippt worden wäre.
Beispiel:
$ ls[Up-Arrow]
ist das Äquivalent von
$ [ESC]/^ls