다음 bash 기능이 있다고 가정해 보겠습니다.
cd(){
builtin cd "$@"
echo "do my own thing"
}
문제는 cd
다른 곳에서 다시 쓰면 1번의 다시 쓰기만 계산되고, 다른 모든 다시 쓰기는 최신 소스 함수에 의해 덮어쓰여진다는 것입니다!
cd
여러 함수를 갖고 모두 호출할 수 있는 방법이 있나요 ?
나는 다음과 같은 것을 생각하고 있습니다 :
alias prev_cd="cd";
cd(){
prev_cd
echo "do my own thing"
}
그러나 나는 이것이 완전히 정확하다고 생각합니다 ..질문해결책은 prev_cd
이로 인해 무한 루프가 발생한다는 것입니다. 여기서 prev_cd는 내 cd 함수를 호출하고 그 반대도 마찬가지입니다.나는 단지 이 파일의 cd 정의 외부에 prev_cd를 정의하고 싶습니다.
내가 사용할 수 있는 한 가지 비결은 cd 함수가 사용 중인 파일을 찾을 수 있다는 것입니다.
shopt -s extdebug
declare -F cd
shopt -u extdebug
명령 을 재정의한 경우 에 cd
전화할 수 있나요 unset -f cd
?
RVM(Ruby Version Manager) 재정의처럼 보입니다 cd
.
CD 14 /사용자/alexamil/.rvm/scripts/cd
그래서 이전 재정의를 엉망으로 만들고 싶지 않습니다 .. 그래서 이전 재정의를 망치지 않고 재정의 cd
하고 싶습니다 ...cd
답변1
정의 본문을 cd
이름이 있는 새 함수에 복사할 수 있습니다 prev_cd
. declare -f cd
해당 정의를 가져온 다음 eval
재정의하는 데 사용합니다 .
definition_prev_cd="prev_$(declare -f cd)"
eval "${definition_prev_cd}"
unset definition_prev_cd # clean up, no reason to leave this string around
cd () {
prev_cd "$@"
echo "do my own thing"
}
임의의 함수를 복제하기 위해 몇 가지 검사를 추가하거나 일반 함수를 생성할 수 있지만 이는 설명하는 문제를 해결하는 데 충분합니다.