从子 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
}
代码示例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
}