4

与我遇到的类似问题有关: zsh not re-computing my shell prompt

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

例如,如果我这样做:

my_date="today is $(date)"

my_date 中的值是:今天是 Thu Aug 9 08:06:18 PDT 2012

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

my_date='today is $(date)'

但从不评估任何东西,它只是字面上保持在 $(date)。

我正在使用 zsh 5.0.0

4

2 回答 2

6

那是不可能的。改用函数:

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

# use it
echo "$(my_date)"

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

于 2012-08-09T15:29:06.287 回答
6

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

setopt promptsubst

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

不管是在设置PS1之前还是之后设置,都应该在显示提示之前发生,每次PS1展开到实际提示时都会检查选项。

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

于 2012-08-09T16:50:21.183 回答