如何在每次使用时评估shell变量

D.C*_*.C. 4 shell interpolation zsh

与我遇到的类似问题有关: zsh没有重新计算我的shell提示符

有没有办法定义一个shell变量,以便每次调用它时计算它的值?

例如,如果我这样做:

my_date="today is $(date)"
Run Code Online (Sandbox Code Playgroud)

my_date中的值为:今天是2012年8月9日星期四08:06:18

但我希望每次使用my_date时都要执行日期.在链接的帖子中,有人建议将值放在单引号中:

my_date='today is $(date)'
Run Code Online (Sandbox Code Playgroud)

但从不评估任何东西,它只是保持字面上$(日期).

我正在使用zsh 5.0.0

Aar*_*lla 6

那是不可能的.改为使用函数:

my_date() {
    echo "today is $(date)"
}

# use it
echo "$(my_date)"
Run Code Online (Sandbox Code Playgroud)

注意:这是bash语法; 你的shell可能会使用稍微不同的语法.


ZyX*_*ZyX 5

你应该在第一种情况下说过PS1:与变量扩展相比,快速扩展是非常不同的.告诉你应该使用PS1='$(command)'单引号的家伙是对的,但他错过了一点:你必须这样做

setopt promptsubst
Run Code Online (Sandbox Code Playgroud)

在提示符中启用命令替换(以及一些其他替换).

无论您是在设置PS1之前还是之后设置它都没关系,它应该在显示提示之前发生,每次PS1扩展到实际提示时都会选中选项.

对于非提示变量,@ Aaron Digulla完全正确,你无法拥有可能在后续评估中改变其价值的变量.但是在zsh中你还可以做两件事:编写一个模块(在C!中)并使用${(%%)VAR}哪个将对给定变量进行快速扩展(注意:它确实尊重promptsubst和另外两个提示*选项).有更多有用的${(...)}扩展标志.