2017-01-20 5 views
0

Ich habe eine einfache Funktion wieWie kann ich auf den aktuellen Wert einer Umgebungsvariablen in einer zsh prexec-Funktion zugreifen?

function clearit() { 
    REM=$(($LINENO % $LINES)) 
    DIV=$(($LINENO/$LINES)) 
    if [[ $DIV -gt 0 && $REM -lt 3 && $DIV ]]; then 
    clear 
    fi 
    echo $LINENO, $LINES 
} 
add-zsh-hook preexec clearit 

In der obigen Funktion einen statischen Wert von $ LINE und $ LINES zur prehook Funktion hinzugefügt. Ich möchte den aktuellen Wert erhalten, wenn der Prexec ausgeführt wird. Wie kann ich das machen ?

+1

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. –

+0

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

Antwort

0

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 ...

Verwandte Themen