如何在每次使用shell变量时对其求值';过去的

如何在每次使用shell变量时对其求值';过去的,shell,interpolation,zsh,Shell,Interpolation,Zsh,与我遇到的类似问题有关: 有没有办法定义一个shell变量,以便每次调用它时都计算它的值 例如,如果我这样做: my_date="today is $(date)" my_date中的值为: 今天是2012年8月9日星期四08:06:18 PDT 但我希望每次使用我的_日期时都执行该日期。在链接帖子中,有人建议将该值用单引号括起来: my_date='today is $(date)' 但从不评估任何东西,它只是停留在$(日期) 我使用的是zsh 5.0.0,这是不可能的。改用函数: my

与我遇到的类似问题有关:

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

例如,如果我这样做:

my_date="today is $(date)"
my_date中的值为: 今天是2012年8月9日星期四08:06:18 PDT

但我希望每次使用我的_日期时都执行该日期。在链接帖子中,有人建议将该值用单引号括起来:

my_date='today is $(date)'
但从不评估任何东西,它只是停留在$(日期)


我使用的是zsh 5.0.0,这是不可能的。改用函数:

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

# use it
echo "$(my_date)"

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

您应该在第一种情况下谈到PS1:提示扩展与变量扩展非常不同。那个告诉你们应该使用带单引号的
PS1='$(command)
的家伙是对的,但他遗漏了一点:你们必须这样做

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

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


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

您的第一个代码示例只是简单的赋值。它将在脚本的其余部分保持不变。考虑创建一个函数,每当调用它时,它将变量赋值给变量。谢谢,我想了很多。你对我原来的问题有什么建议吗?我想使用PS1=“${prompt\u user}${prompt\u dir}$(prompt\u git)%#”设置自定义提示。问题是$(prompt\u git)会被计算一次,而不会再被计算。我希望每次显示提示时都重新评估它。非常感谢。setopt promptsubst是我丢失的一块。