gpt4 book ai didi

bash - 如果源脚本在函数中运行,为什么 bash 变量不是全局变量?

转载 作者:行者123 更新时间:2023-11-29 09:27:11 25 4
gpt4 key购买 nike

通常从另一个脚本获取文件,我可以访问它的变量。

如果我从一个函数中获取一个脚本,它的变量不是全局的,这似乎与联机帮助页相矛盾:

FUNCTION Variables local to the function may be declared with the local builtin command. Ordinarily, variables and their values are shared between the function and its caller.

source filename [arguments] Read and execute commands from filename in the current shell environment

发生在我所有方便的可用版本上:3.2.57(1)-release (x86_64-apple-darwin17)、4.3.42(1)-release (x86_64-suse-linux-gnu) 和版本 4.3.48 (1)-release (x86_64-pc-linux-gnu)

测试源.sh:

#!/bin/bash
echo $BASH_SOURCE $$ $SHLVL
declare -x FOO=bar
foo() { echo funfoo=$FOO $$ $SHLVL ; }

测试顶部.sh:

#!/bin/bash
echo $BASH_SOURCE $$ $SHLVL

funcsource () { source ./test-sourced.sh ; }
echo ==== funcsource...
funcsource
echo foo=$FOO
foo

echo ==== source...
source ./test-sourced.sh
echo foo=$FOO
foo

我看到了这个输出,但希望看到 funcsource 和 source 做同样的事情:

$ ./test-top.sh 
./test-top.sh 1234 2
==== funcsource...
./test-sourced.sh 1234 2
foo=
funfoo= 1234 2
==== source...
./test-sourced.sh 1234 2
foo=bar 1234 2
funfoo=bar

它是相同的 PID 和相同的 shell 级别,所以它看起来像是故意的行为。这是一个错误,还是我遗漏了什么?


更新:回显 $FOO 并在 source 命令给出它们的值后立即在函数中运行 'foo'范围。这似乎仍然与手册相矛盾。

最佳答案

出现此行为的原因是因为您正在使用 declare shell 内置函数。根据help declare:

When used in a function, declare makes NAMEs local, as with the local command. The -g option suppresses this behavior.

更改 test-sourced.sh 以使用 declare -g 而不是 declare -x(将变量导出到环境)——或者一个常规的 shell 变量赋值——应该显示预期的行为(变量是全局的):

#!/bin/bash
echo $BASH_SOURCE $$ $SHLVL

# Simple shell variable assignment (global by default)
FOO=bar

# Use declare to globally assign a value to the shell variable
declare -g FOO=bar

foo() { echo funfoo=$FOO $$ $SHLVL ; }

如果您希望从该 shell session 启动的 future 子进程可以访问该变量,则将变量导出到环境只会增加实用性。如果这是您想要的,您可以使用以下任一 Bash 结构来确保变量既是全局变量又是导出变量:

export FOO=bar
declare -x -g FOO=bar

关于bash - 如果源脚本在函数中运行,为什么 bash 变量不是全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49772668/

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