`cd` 또는 기타 내장 함수를 여러 번 재정의함

`cd` 또는 기타 내장 함수를 여러 번 재정의함

다음 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"
}

임의의 함수를 복제하기 위해 몇 가지 검사를 추가하거나 일반 함수를 생성할 수 있지만 이는 설명하는 문제를 해결하는 데 충분합니다.

관련 정보