주어진 파일 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
및 사용을 피합니다 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] 삭제
몇 마디 만하겠습니다