Umgebungsvariablen werden nicht korrekt erweitert, wenn sie mit einer Funktion verknüpft sind

Umgebungsvariablen werden nicht korrekt erweitert, wenn sie mit einer Funktion verknüpft sind

Hier ist ein Teil meiner .bashrcDatei:

echo_pwd () {
    echo `pwd`
}
export echo_pwd="`echo_pwd`/"

Ich habe eine neue Funktion erstellt echo_pwd, die den Pfad des aktuellen Verzeichnisses ausgibt, und eine neue Umgebungsvariable, die das aktuelle Verzeichnis gefolgt von einem Schrägstrich enthält. Daher kann ich meine Umgebungsvariable in der Befehlszeile verwenden (z. B. $PWD).

Allerdings wird diese Umgebungsvariable nicht richtig erweitert und verweist immer auf mein Home-Verzeichnis:

~/Documents$ env | grep echo_pwd
echo_pwd=/home/pierre/
~/Documents$

Was kann ich tun, damit meine Umgebungsvariable richtig erweitert wird?

Hinweis: Dies ist offensichtlich ein Dummy-Beispiel. In meinem speziellen Anwendungsfall handelt es echo_pwdsich um eine viel komplexere Funktion.

Antwort1

Wahrscheinlich führen Sie die Funktion nur einmal aus und legen den Wert Ihrer Variablen nur einmal fest.

Um den Wert der Variablen bei jeder Verwendung automatisch zu aktualisieren cd, können Sie die integrierte Funktion der Shell cdwie folgt überschreiben:

cd () {
    builtin cd "$@"
    echo_pwd=$( echo_pwd )/
}

Dadurch wird die integrierte Funktion cdmit den Argumenten aufgerufen, die Sie der cdFunktion gegeben haben, und anschließend der Wert Ihrer Variable aktualisiert (beachten Sie, dass dies exportnicht erforderlich ist, wenn Sie sie bereits an eine andere Stelle exportiert haben, sofern sie überhaupt exportiert werden muss).

Das komplette Setup könnte so aussehen

echo_pwd () {
    printf '%s\n' "$PWD"    # or just: pwd
}
export echo_pwd="$( echo_pwd )/"

cd () {
    builtin cd "$@"
    echo_pwd=$( echo_pwd )/
}

Ich habe mich entschieden fürmitprintfmit $PWDanstatt das pwdDienstprogramm aufzurufen, und ich bin auchVerwendung $(...)für Befehlsersetzungen.

Antwort2

In export echo_pwd="`echo_pwd`/"wird die Befehlsersetzung nur einmal durchgeführt, wenn die Variable gesetzt wird.

Wenn Sie den Wert der Variablen aktualisieren müssen, müssen Sie ihn erneut festlegen.

In interaktiver Bash könnten Sie verwendenPROMPT_COMMAND, das jedes Mal ausgeführt wird, wenn die Eingabeaufforderung gedruckt wird:

$ PROMPT_COMMAND='echo_pwd="`echo_pwd`/"'
$ cd bar/
$ echo $echo_pwd/
/tmp/foo/bar//
$ cd baz
$ echo $echo_pwd
/tmp/foo/bar/baz/

verwandte Informationen