从子 shell 将值设置为全局变量

Set a value to global variable from a subshell

代码示例main.zsh:

#!/usr/bin/env zsh

. ./my_script.zsh

my_global_var=""

output=$(my_func)

代码示例my_script.zsh:

#!/usr/bin/env zsh

my_func(){
    my_global_var="hello!" # doesn't work!
    echo "my output" # return value
}

在这种情况下,如何在子 shell 中将值从 my_func 设置为 my_global_var。我在这里尝试做的是,我只是尝试在 zsh 中实现一个函数概念,它能够通过变量替换机制 $() return 一个值,但问题是如果我在这样,我将无法从我的函数访问全局变量。我现在很困惑,也许我在 zsh 中以错误的方式实现了一个函数概念。

你不能。 my_func 在一个单独的进程中运行,因此它对 my_global_var 所做的任何事情都是该进程的本地操作,main.zsh 看不到。您的函数可以用于设置全局变量或输出旨在被 $(...) 捕获的文本,但不能同时用于两者。

谢谢@chepner 的回答,顺便说一句,我想用另一种方法来解决这个问题。很多人都在谈论"return multiple variables",同样的,我在这里给大家一个"eval trick"

代码示例main.zsh:

#!/usr/bin/env zsh

. ./my_script.zsh

my_global_var=""
output=""

temp=$(my_func)
eval $(echo $temp) # become: set_vars "hello!" "my output"

代码示例my_script.zsh:

#!/usr/bin/env zsh

my_func(){
    echo 'my_global_var="hello!"; output="my output"' # return values
}