给定文件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
有没有比使用type
和eval
从覆盖函数中调用旧函数同时保留相同名称的更好的解决方案,因此在其他函数中的引用仍然有效?
这两个m.sh
和e.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
以添加此类样板,但至少避免使用type
and 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] 删除。
我来说两句