Für normale Shell-Variablen, Sie wird den aktuellen Wert erhalten:
% x=1
% function test_hook() { echo $x; }
% add-zsh-hook preexec test_hook
% true
1
% x=2
1
% true
2
jedoch $LINENO
ist eine ganz besondere Variable. Aus der Dokumentation:
LINENO < S>
Die Zeilennummer der aktuellen Zeile im aktuellen Skript, bezogen Datei oder Shell-Funktion ausgeführt wird, je nachdem, was zuletzt gestartet wurde. Beachten Sie, dass im Fall von Shell-Funktionen die Zeilennummer auf die Funktion verweist, wie sie in der ursprünglichen Definition erschien, nicht notwendigerweise so, wie sie von den eingebauten Funktionen angezeigt wird.
Wenn Ihre Hook-Funktion ausgeführt wird, handelt es sich definitionsgemäß um die zuletzt gestartete Shell-Funktion, das Skript oder die Quelldatei. So $LINENO
gibt Ihnen immer die aktuelle Zeile innerhalb Ihrer Hook-Funktion. Es gibt keine Möglichkeit, auf das $LINENO
für das äußere Oszilloskop zuzugreifen.
Allerdings, selbst wenn Sie auf die äußere $LINENO
in Ihrem Haken zugreifen könnten, würde es zu sehr seltsames Verhalten meiner Meinung nach führen. Nehmen wir an, Ihr Terminal ist 30 Zeilen hoch ($LINES
ist 30), es würde das Terminal löschen, bevor der 30., 31. und 32. Befehl ausgeführt wird, dann nichts für die nächsten 27 Befehle, dann wieder vor dem 60., 61. und 62. usw. löschen auf. Ich glaube nicht, dass das entfernt ist, was Sie erreichen wollen ...
Es scheint, dass 'LINENO' in einer Funktion seinen Wert aus der Zeile erhält, in der der jeweilige Befehl läuft. Nicht das aktuelle LINENO des Benutzers. Es ist nicht statisch, da das Ändern von 'LINES' nach dem Erstellen des Hooks seinen Wert ändert. Ich bin mir nicht sicher, wie ich es beheben soll. –
Wenn Sie nach der aktuellen Zeile des Cursors suchen, also können Sie diese durch die Summe der Zeilen auf dem Bildschirm teilen, wird es schwierig: siehe diese Antwort: http://unix.stackexchange.com/questions/88296/get-vertikal-Cursor-Position/183121 # 183121 – gregory