在bash中实现匿名函数是否可行(如果需要,甚至使用eval)?

时间:2012-09-06 12:02:54

标签: bash

由于bash没有第一类函数,我通过将一个字符串传递给一个函数来模拟匿名函数,然后由eval进行评估。

it() {
    echo "$1" # prints the description of the spec
    beforeEach # a setup function
    eval "$2"

    if (($? == 0)); then
        # do something
    fi

    afterEach  # a cleanup function
}

it "should echo something" '{
  echo "something"
}'

这允许编写非常简洁的测试(它定义了一个规范)。现在我想知道这是否是对eval的有效使用。

修改

我知道在匿名函数字符串中不需要打开{和关闭},就像那样,它类似于像Jasmine这样的东西。

修改

pseudo anonymous function实际上是一个测试,这意味着在测试结束时,有类似的东西

[[ var == 'foo' ]]

((i > 10))

即。某种测试(或以XUnit术语断言)。它永远不需要返回任何东西,而不是返回代码然后被评估,如果返回代码为0(成功),描述将以绿色打印,否则为红色(测试失败)。

3 个答案:

答案 0 :(得分:3)

我不认为这是eval的有效案例。在以下几种情况下,匿名函数很有用:closuresCurryingcallbacks会浮现在脑海中(无意识的头韵)。这个实现没有给你这些功能,因为你的eval'ed伪函数仍然不能返回一个值(除了0-255退出状态),并且肯定不能返回另一个匿名函数。

答案 1 :(得分:2)

对于一次性使用“匿名”函数,我使用以下约定在函数范围内执行bash脚本:

#!/usr/bin/env bash
_() {
  #...
} && _ "$@"
unset -f _

虽然不是真正的匿名,但这类似于JavaScript中的IIFE (Immediately-Invoked Function Expression)习语。

Bash函数必须具有名称。您可以使用任何您喜欢的名称(main是一个受欢迎的选择。)我更喜欢单个下划线_因为a)它很短而b)它通常用于许多语言中以表示一次性值。< / p>

答案 2 :(得分:1)

如果它完成了工作,你(以及理想的其他人)完全理解它是如何工作的。

我一直在为测试用例自动化编写类似的代码超过一次或两次,但我承认它会变得非常毛茸茸,特别是如果你开始简单然后允许它有机增长。

对于它的价值,我想建议一种风格改进;

if eval "$2"; then
  # something

或者如果“某事”是一个简单的命令,那么普通的

eval "$2" && # something

话虽如此,如果你完全避免使用eval可能会更好,但这取决于你的测试用例。

$2 && # something