gpt4 book ai didi

zsh - 无法更改用于 zsh 提示的函数中的全局变量

转载 作者:行者123 更新时间:2023-12-05 03:09:38 25 4
gpt4 key购买 nike

我正在尝试构建一个 zsh 函数,该函数根据时间间隔返回输出。最初“你渴了”条件为真,但在通过命令行更改变量 thirsty 并将其设置为 false 后,初始 if 语句通过,但变量 thirsty 不会改变 global variable thirty有没有办法修改全局变量thirsty

thirsty=
last_time=

drink_water() {
echo -n "$thirsty"

if [[ $thirsty == false ]]; then
last_time="$[$(date +%s) + 10]"
thirsty=true
echo -n "${last_time} $(date +%s) ${thirsty}"

elif [[ $[last_time] -lt $(date +%s) ]]; then
echo -n "💧 You're thirsty"
fi

}

最佳答案

由于您的代码实际上是从以下位置调用的:

PROMPT='$(drink_water)'

...它包含的所有内容都在作为此命令替换操作的一部分生成的子进程中运行($() 是一个“命令替换”:它创建一个新的子进程,运行给定的代码在该子进程中,并读取子进程的输出)。当该子进程退出时,在子进程内对变量(甚至是全局变量)所做的更改将丢失。

如果您将更新代码直接放在 precmd 函数中,那么它会在打印每个提示之前运行,但没有命令替换干预。即:

precmd() {
local curr_time=$(date +%s) # this is slow, don't repeat it!
if [[ $thirsty = false ]]; then
last_time="$(( curr_time + 10 ))"
thirsty=true
PROMPT="$last_time $curr_time $thirsty"
elif (( last_time < curr_time )); then
PROMPT="💧 You're thirsty"
fi
}

当然,您可以使用命令替换来设置 PROMPT,但是对变量状态的更新必须单独完成,在命令替换之外,如果它们要坚持。

关于zsh - 无法更改用于 zsh 提示的函数中的全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42395807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com