내 함수가 "함수"를 어떻게 파괴하나요?

내 함수가 "함수"를 어떻게 파괴하나요?

나는 git checkout을 위한 ksh 함수를 작성했습니다. (이것이 왜 나에게 적합한지 궁금하시다면 홍보를 위해 일부 관련 없는 독점 구성요소를 제거했습니다.)

# Checkout quicker
checkout(){
if [ "$1" == "master" ]; then
   git checkout master
else
   git checkout $1
fi
}

그러나 명령줄을 사용하여 함수를 보면 functions이상한 결과가 나타납니다.

$ functions checkout
checkout()
}

# Checkout quicker
checkout(){
if [ "$1" == "master" ]; then
   git checkout master
else
  $ <- (this is my PS1, which I'm not writing here because it's big)

기능이 비정상적으로 표시되는 이유는 무엇입니까? functions함수 내부에 함수 이름을 사용하여 기술적으로 문제를 해결하고 있나요 ? RHEL에서 ksh93u+ 2012-08-01을 사용하고 있습니다.

답변1

나중에 수정될 버그가 발생한 것 같습니다.이번에 제출하세요. CentOS 7에서 ksh93을 사용하여 재현할 수 있습니다.

$ cat a
# Checkout quicker
checkout(){
if [ "$1" == "master" ]; then
   git checkout master
else
   git checkout $1
fi
}
$ . ./a
$ functions checkout
checkout(){
if [ "$1" == "master" ]; then
   git checkout master
else
   git checkout $1
fi
}
$ vi a

함수의 원본 파일을 편집하고 함수 정의 앞에 텍스트를 추가합니다. 지금:

$ cat a
01234567801234567890123456789
}
# Checkout quicker
checkout(){
if [ "$1" == "master" ]; then
   git checkout master
else
   git checkout $1
fi
}
$ functions checkout
checkout()
}
# Checkout quicker
checkout(){
if [ "$1" == "master" ]; then
   git checkout mast$

커밋 로그 인용:

[v1.1] typeset -f <functname>: 빌드 스크립트 사용sh_deparse()

문제 재현:

  • 함수 정의가 포함된 스크립트 찾기 또는 작성
  • .스크립트 사용 또는 가져오기source
  • typeset -f괜찮아 보이는 함수 정의를 인쇄하려면 ; 을 사용하세요.
  • 파일을 편집하여 함수 정의 앞이나 안에 문자를 추가 또는 제거하거나 파일 이름을 바꾸거나 삭제합니다.
  • 인쇄 기능 정의가 다시 typeset -f손상되었습니다.

원인: ksh는 소스 파일에 있는 함수 정의의 오프셋과 길이를 기억하고 소스 파일에 있는 해당 오프셋의 바이트 수를 덤프하여 함수 정의를 인쇄합니다. 파일을 편집하거나 (재)이동하면 이는 분명히 중단되므로 이 접근 방식은 근본적으로 결함이 있으므로 교체해야 합니다.

관련 정보