与函数相关时,环境变量无法正确扩展

与函数相关时,环境变量无法正确扩展

这是我的文件的一部分.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/

相关内容