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

无法更改用于zsh提示符的函数中的全局变量,zsh,Zsh,我试图构建一个zsh函数,该函数根据时间间隔返回输出。最初,“You's quirty”条件为true,但在通过命令行更改变量quirty并将其设置为false后,初始if语句将通过,但其中的变量quirty不会更改全局变量quirty是否有方法修改全局变量quirty? thirsty= last_time= drink_water() { echo -n "$thirsty" if [[ $thirsty == false ]]; then last_time="$[$(da

我试图构建一个zsh函数,该函数根据时间间隔返回输出。最初,“You's quirty”条件为true,但在通过命令行更改变量
quirty
并将其设置为false后,初始if语句将通过,但其中的变量
quirty
不会更改
全局变量quirty
是否有方法修改全局变量
quirty

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 "Since your code is actually called from:

PROMPT='$(drink_water)'
口渴= 上次= 喝水{ echo-n“$口渴” 如果[[$口渴==false]];则 last_time=“$[$(日期+%s)+10]” 口渴=真的 echo-n“${last_time}$(日期+%s)${quirty}” elif[$[上次]-lt$(日期+%s)];然后
echo-n“因为您的代码实际上是从以下位置调用的:

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

如果将更新代码直接放在
precmd
函数中,则会在打印每个提示之前运行更新代码,但不会有命令替换介入。即:

precmd(){
本地当前时间=$(日期+%s)#这很慢,不要重复!
如果[[$QUIRTY=false]];则
last_time=“$((当前时间+10))”
口渴=真的
PROMPT=“$last\u time$curr\u time$quirty”
elif((上次<当前时间));然后

PROMPT=“因为您的代码实际上是从以下位置调用的:

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

如果将更新代码直接放在
precmd
函数中,则会在打印每个提示之前运行更新代码,但不会有命令替换介入。即:

precmd(){
本地当前时间=$(日期+%s)#这很慢,不要重复!
如果[[$QUIRTY=false]];则
last_time=“$((当前时间+10))”
口渴=真的
PROMPT=“$last\u time$curr\u time$quirty”
elif((上次<当前时间));然后


PROMPT=“(顺便说一句,
echo-n
实际上是一种不好的形式--
-n
作为实现定义提供时的标签行为,这意味着不同的shell可以使用
echo-n
执行不同的操作。如果您想要保证打印准确的字符串而不使用换行符,请使用
printf'%s'”字符串“
;另请参见上述链接的应用程序使用部分)。直接回答这个问题:所有外壳变量都是全局的,除非你明确地标记它们。这就是为什么这个问题需要一个显式的复制器——其他人可以复制、粘贴和运行代码,而不做任何修改来查看自己的行为。我有另一个函数调用这个函数最后我有
PROMPT='$(spaceship_PROMPT)
你说它是计时的,这意味着你没有向我们展示控制时间的代码。请更新脚本。同一脚本中的另一个函数?(顺便说一句,
echo-n
实际上是一种不好的形式--
-n
作为实现定义提供时的标签行为,这意味着不同的shell可以使用
echo-n
执行不同的操作。如果您想要保证打印准确的字符串而不使用换行符,请使用
printf'%s'“string”
;另请参见上述链接的应用程序使用部分)。直接回答这个问题:所有外壳变量都是全局的,除非你明确地标记它们。这就是为什么这个问题需要一个显式的复制器——其他人可以复制、粘贴和运行代码,而不做任何修改来查看自己的行为。我有另一个函数调用这个函数最后我有
PROMPT='$(宇宙飞船提示)“
您说它是计时的,这意味着您没有向我们显示控制时间的代码。请更新脚本。同一脚本中的另一个函数?这似乎工作正常,但假设我有一些其他函数为
提示符
生成其他不同的输出,那么如何设置
PRO?”MPT
添加到所有这些函数的输出中。因为此函数显式地将输出添加到
提示符
。坦率地说,这超出了这个问题的范围。也就是说,我建议将逻辑从视图中拆分为单独的函数。也就是说,在一个函数中进行更新,从主shell调用,并生成您在命令替换中调用的单独函数的铃声显示。但是,该建议是在“为了它的价值,不接受后续操作”上提供的basis--任何将此转换为a的努力都将受到反对。哦,不管怎样,你的回答澄清了我的困惑,因为我认为问题与范围有关。谢谢。这似乎工作得很好,但假设我有一些其他函数,为
提示符
生成其他不同的输出,那么我该如何进行se将
PROMPT
添加到所有这些函数的输出中。因为此函数显式地将输出添加到
PROMPT
。坦率地说,这超出了这个问题的范围。也就是说,我建议将您的逻辑从视图中拆分为单独的函数。也就是说,在从主shell调用的一个函数中进行更新,然后从命令替换中调用的单独函数生成显示字符串。但是,该建议在“for what”上提供