我遇到了一个问题,试图在 fish 函数中根据程序的输出动态设置一些变量。
我将问题缩小到 MWE:
function example
eval (echo 'set -x FOO 1;')
end
Run Code Online (Sandbox Code Playgroud)
调用:
>example
>echo $FOO
Run Code Online (Sandbox Code Playgroud)
导致没有输出——即尚未设置 FOO 环境变量。我应该怎么做?
同样的事情以更简单的形式发生:
function trythis
set -x foo bar
end
Run Code Online (Sandbox Code Playgroud)
如果您现在运行trythis
和echo $foo
,它也不会设置。那是因为 fish-x
本身不会改变变量的范围,默认情况下,该变量是函数的局部范围,除非它已经全局或普遍存在。
尝试:
eval (echo 'set -gx FOO 1;')
Run Code Online (Sandbox Code Playgroud)
哪里g
是全局的。这使得变量像正常的 POSIX export
ed 值一样工作。有趣的是,它的工作方式与eval
普通set
; 如果您g
在命令行上直接使用该行,$FOO
则设置,因此eval
进程替换()
并没有引入新的范围或子shell,并且在函数中以这种方式执行时,该函数的范围适用。