为什么 bash 甚至解析/运行放入环境变量中的内容?

为什么 bash 甚至解析/运行放入环境变量中的内容?

炮弹休克症bash 中的 bug 通过环境变量起作用。老实说,我对有这样一个功能感到惊讶:

“通过环境变量传递函数定义”

因此,这个问题虽然可能不完美,但要求提供一个示例或案例,其中有必要具有此功能?

额外福利。其他 shell 如 zsh、dash 等也有这个功能吗?

答案1

当一个脚本调用另一个脚本时,可以导出父脚本的变量,然后它们将在子脚本中可见。导出函数是一个明显的概括:从父级导出函数,使其在子级中可见。

环境是进程向其子​​进程传递任意数据的唯一便捷方式。数据必须被编组为不包含空字节的字符串,这对于 shell 函数来说不是困难。还有其他潜在的方法,例如共享内存块或通过文件描述符传递的临时文件,但这些可能会导致中间程序出现问题,这些程序不知道如何处理它们或会关闭它们。程序期望在包含它们不知道或不关心的变量的环境中运行,因此它们不会覆盖或删除它们。

选择使用函数名称作为环境变量的名称是一种奇怪的选择。一方面,这意味着导出的变量与同名的导出函数发生冲突。

导出函数是一个旧功能。 Bourne shell 中添加了函数在SVR2中,以及导出的函数版本 8 外壳同年(1984年)发布。在该 shell 中,变量和函数使用相同的命名空间。我不知道函数导出是如何工作的。这传家宝贝壳基于 Bourne 变体,该变体具有函数但不导出它们。

ATT ksh 据说支持导出功能,但查看源代码或使用它,我看不到它支持导出功能,从 ksh93u 开始。

env -i /usr/bin/ksh -c 'f=variable; f () { echo function; }; typeset -fx f; /usr/bin/env; ksh -c f'
_=*25182*/usr/bin/env
PWD=/home/gilles
SHLVL=1
A__z="*SHLVL
ksh: f: not found

Ksh 的公共域克隆(pdksh、mksh)、dash 和 zsh 不支持导出功能。

相关内容