为什么 bash 甚至解析/运行放在环境变量中的东西?

hum*_*ace 9 bash environment-variables function shellshock

bash 中的shellshock错误通过环境变量起作用。老实说,我对有这样一个功能感到惊讶:

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

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

奖金。其他 shell zsh、dash 等也有这个功能吗?

Gil*_*il' 4

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

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

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

导出函数是一个旧功能。SVR2 中的Bourne shell 中添加了函数,并在同年(1984 年)发布的Version 8 shell中导出了函数。在该 shell 中,变量和函数使用相同的命名空间。我不知道函数导出是如何工作的。Heirloom 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
Run Code Online (Sandbox Code Playgroud)

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