與函數相關時,環境變數無法正確擴展

與函數相關時,環境變數無法正確擴展

這是我的文件的一部分.bashrc

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

我創建了一個新函數echo_pwd,用於列印當前目錄的路徑和一個新環境變量,其中包含當前目錄,後跟斜線。因此,我可以在命令列中使用我的環境變數(例如$PWD)。

但是,此環境變數無法正確擴展,並且始終引用我的主目錄:

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

我該怎麼做才能讓我的環境變數正確擴展?

注意:這顯然是一個虛擬範例。在我的具體用例中,這echo_pwd是一個更複雜的函數。

答案1

您可能只執行該函數並設定變數的值一次。

要在使用時自動更新變數的值cd,您可以覆寫 shell 的內建函數,cd如下所示:

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

cd這將使用您為函數提供的任何參數來呼叫內建函數cd,然後更新變數的值(請注意,export如果您已經將其匯出到其他地方,或者根本需要匯出,則不需要)。

完整的設定可能看起來像

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

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

我選擇了使用printf$PWD不是調用該pwd實用程序,我也是用於$(...)命令替換

答案2

在 中export echo_pwd="`echo_pwd`/",命令替換僅在設定變數時執行一次。

如果需要更新變數的值,則需要再次設定它。

在互動式 bash 中,您可以使用PROMPT_COMMAND,每次列印提示時都會執行:

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

相關內容