为什么此自定义采购功能无法使我声明的变量在全球范围内可用?

奇希兹·夏尔马(Kshitiz Sharma)

我面临一个非常奇怪的问题。我知道我缺少一些基本的知识,但对于我的一生,我还不太清楚。

在文件中考虑以下声明tmp.sh

declare -A aa
aa[1]=hello
aa[2]=world

myfunc() {
    echo exists
}

myvar=exists

我将脚本作为源source tmp.sh并运行:

myfunc
echo $myvar
echo ${aa[@]}

输出为:

exists
exists
hello world

现在,我做同样的事情,但是将source语句放在一个函数中:

mysource() {
    filename="$1"
    source "$filename" 
}

这次的输出是:

exists
exists

这里发生了什么?

123

-g选项添加declare[1]

从手册

-g在shell函数中使用时创建全局变量;否则被忽略(默认情况下,在shell函数中使用declare声明局部作用域变量)

在下面的chepner评论中提及也很有用

source通过完全执行文件的内容来工作,就像您用文件的内容替换了source命令一样。即使声明语句不在文件的函数中,它们仍是调用source的函数的一部分。


[1]该-g选项需要Bash 4.2或更高版本

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么VLookup无法在我定义的范围内工作?

使模块在全球范围内可用

$(this)如何在全球范围内可用

Sencha Touch-为什么在我的自定义组件中未定义此功能?

为什么此自定义QWidget无法正确显示

我应该在哪里放置类型/接口以使其在全球范围内可用?

为什么在“捕获”或“最终”范围内的“尝试”中未声明变量?

为什么要使用extern关键字在命名空间范围内声明变量?

如何在全球范围内向茉莉花添加自定义匹配器?

为什么我不能在类范围内声明概念?

为什么我收到“未在该范围内声明getuid”错误?

如何使AngularJS内置服务在全球范围内可用?

使扩展方法/属性在全球范围内可用

Angular服务在全球范围内可用吗?

为什么我不能在基于for的范围内使用此“ void”类型?

在自定义范围内没有出现-面料

在自定义范围内生成随机数

为什么我的自定义UITableViewCell无法正确显示?

为什么我的自定义ArrayAdapter无法填充?

为什么我的自定义控件无法正常工作?

为什么在全球范围内sqrt比MinGW中的std :: sqrt慢得多?

在变量范围内挣扎,无法在功能之间传递城市

为什么我的Just ord <*> Nothing出现“变量不在范围内”?

变量在全局范围内,但是为什么函数无法访问?

为什么我不能在横梁范围内生成预定义的闭包

来自IIFE的变量可在全球范围内访问

为什么我的代码无法在给定范围内打印素数?

为什么Java的允许两个变量具有相同名称在同一范围内声明?

为什么if语句不在全局范围内寻找变量

TOP 榜单

热门标签

归档