bash中的“继承”;有没有办法在覆盖函数中调用super(没有eval)?

乔尔

给定文件m.sh

f() {
  echo foo
}

g() {
  f | sed -r 's/^|$/:/g' # random work
}

e.sh

. m.sh

old_f="$(type f | sed '3,$!d')"

f() {
  echo "$(eval "$old_f")bar"
}

g

有没有比使用typeeval从覆盖函数中调用旧函数同时保留相同名称的更好的解决方案,因此在其他函数中的引用仍然有效?

这两个m.she.sh是同一项目的一部分,所以我们可以通过修改m.sh无后顾之忧。

乔尔

我只是想到我可以做:

f_1() {
  echo foo
}

f() { f_1 "$@"; }

g() {
  f | sed -r 's/^|$/:/g' # random work
}
. m.sh

f_2() {
  echo "$(f_1)bar"
}

f() { f_2 "$@"; }

g

这很糟糕,需要修改m.sh以添加此类样板,但至少避免使用typeand eval

f()可以通过将第一个定义定义为一次来避免必须手动重新定义以增加数量:

f() {
  "$(last_version_of_function "${FUNCNAME[0]}")" "$@"
}

通过使用以下定义:

reverse_identifier_words() {
  awk -F_ '
    BEGIN {
      OFS="_"
    }
    {
      for (i = 1; i <= NF / 2; i++) {
        t = $i
        $i = $(NF - i + 1)
        $(NF - i + 1) = t
      }
      print
    }
  '
}

last_version_of_function() {
  declare -F \
  | grep -Eo "\b${1}_[0-9]+\$" \
  | reverse_identifier_words \
  | sort -rn -t_ -k1 \
  | head -n1 \
  | reverse_identifier_words
}

这样,e.sh只需执行以下操作即可覆盖:

. m.sh

f_2() {
  echo "$(f_1)bar"
}

g

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

有没有办法在ListView中调用函数?

有没有办法从bash函数调用中强制回显命令行?

有没有办法覆盖 Mockito 中的 doReturn?

有没有办法从方法中调用对象?

有没有办法在C ++中复合函数?

有没有办法将覆盖函数放在 Kotlin 的单独文件中?

有没有办法在javascript中调用对象内的所有函数?

JavaScript中有没有办法减少递归函数调用中的调用栈大小?

有没有办法在调用 nodejs 中的控制器之前调用函数

有没有办法让函数调用“继续”影响其调用者中的循环?

有没有办法使成员函数不能从构造函数中调用?

有没有办法在单独的 js 文件中为 jquery click() 函数调用函数?

有没有办法在Kotlin中从内部调用匿名函数?

有没有办法以角度调用html属性值中的函数?

有没有办法在函数调用中更改对对象的原始引用

有没有办法知道超类构造函数中调用对象的子类?C ++

有没有办法一次在JavaScript中多次调用函数?使用木偶

有没有办法从python中的调用函数访问变量?

有没有办法在ssh中运行本地bash函数

有没有办法从bash中的函数内部获取脚本的位置参数?

有没有办法调用部分函数

有没有办法在Python中覆盖现有(系统)类上的方法?

函数名称与内核模块中的函数冲突。有没有办法先调用自己的函数?

有没有办法在使用 hy.eval 时从环境中捕获名称?

在菱形继承结构中,有没有办法在分支之间进行投射?

有没有办法只允许对C ++中的最终类进行继承

有没有办法让子类根据python中的输入从不同的父类继承?

有没有办法让 Racket Web 应用程序中的按钮调用文件中定义的函数?

有没有办法在脚本中更新而不是覆盖 Dask YarnCluster 的 worker_env?