关于在 Linux shell 中将函数传递给子进程的问题

关于在 Linux shell 中将函数传递给子进程的问题

我正在做 Shellshock 实验室,该教程提供了一种通过环境变量将函数传递给子进程的方法:

$ foo='() { echo "hello"; }'
$ export foo
$ /bin/bash
$ foo
hello

但是,当我在 Ubuntu 20.04 上尝试执行此操作时,foo它并没有转换为子进程中的函数。

$ foo='() { echo "hello"; }'
$ export foo
$ /bin/bash
$ foo
Command 'foo' not found, did you mean: ...

我是否遗漏了什么,或者这种方法仅适用于某些版本的 bash?

答案1

在 Bash 中你定义shell 函数像这样:


name () { ...; }

或者像这样:

function name { ...; }

多行代码如下:

name ()
{
...
...
}

或者像这样:

function name
{
...
...
}

并且是出口-f像这样:

export -f name

因此,像这样声明你的函数:

foo () { echo "hello"; }

然后像这样导出:

export -f foo

技术通告

也就是说,您所描述的类似于大约十年前在 Bash 中存在的历史漏洞(特别是在“函数导出”功能/机制语法和后续解析中),但很久以前就已修复,因此不再适用于 Bash,除非您的系统上仍然有未修补/未更新的 Bash 版本。

请参见:

答案2

从 Bash 4.4 开始,函数现在导出为BASH_FUNC_foo%%而不是foo。这不是有效的 shell 变量名,因此您不能直接在 Bash 中设置它,但您可以使用其他命令(例如 )env来设置它env BASH_FUNC_foo%%='() { echo "hello"; }' /bin/bash

相关内容