run-help
zsh 설치부터 시작하여 (zsh 섹션 중 하나)와 같은 명령에 대한 매뉴얼 페이지가 열립니다 . 최근에 함수 소스 코드를 찾아보니 대부분의 zsh 명령/내장 명령에 대한 도움말이 이미 호출기를 사용하여 열려 있어야 한다는 것을 발견했습니다. print를 사용하여 함수의 실제 코드를 로드한 후 실제 소스 코드와 다르다는 것을 알았습니다.typeset
autoload
/usr/share/zsh/functions/Misc/run-help
functions run-help
두 가지 버전과 차이점은 다음과 같습니다. 두 번째 버전(소스 코드)도 functions run-help
I 이후에 출력 됩니다.약간문제를 해결했습니다.
zsh 로드 기능
run-help () {
emulate -RL zsh
local HELPDIR="${HELPDIR:-/usr/share/zsh/5.8/help}"
[[ $1 == "." ]] && 1="dot"
[[ $1 == ":" ]] && 1="colon"
if [[ $# == 0 || $1 == "-l" ]]
then
if [[ -d $HELPDIR ]]
then
echo "Here is a list of topics for which special help is available:"
echo ""
print -rc $HELPDIR/*(:t)
else
echo "There is no list of special help topics available at this time."
fi
return 0
elif [[ -n "${HELPDIR:-}" && -r $HELPDIR/$1 && $1 != compctl ]]
then
${=PAGER:-more} $HELPDIR/$1
return $?
fi
local what places noalias newline='
'
integer i=0 didman=0
places=("${(@f)$(builtin whence -va $1)}")
if [[ $places = *"not found"* && $1 != ${(Q)1} ]]
then
places=("${(@f)$(builtin whence -va ${(Q)1})}")
if (( ${#places} ))
then
set -- "${(Q)@}"
fi
noalias=1
fi
{
while ((i++ < $#places))
do
what=$places[$i]
[[ -n $noalias && $what = *" is an alias "* ]] && continue
builtin print -r $what
case $what in
(*( is an alias for (noglob|nocorrect))*) [[ ${what[(w)7]:t} != ${what[(w)1]} ]] && run_help_orig_cmd=${what[(w)1]} run-help ${what[(w)7]:t} ;;
(*( is an alias)*) [[ ${what[(w)6]:t} != ${what[(w)1]} ]] && run_help_orig_cmd=${what[(w)1]} run-help ${what[(w)6]:t} ;;
(*( is a * function)) case ${what[(w)1]} in
(comp*) man zshcompsys ;;
(zf*) man zshftpsys ;;
(run-help) man zshcontrib ;;
(*) builtin functions ${what[(w)1]} | ${=PAGER:-more} ;;
esac ;;
(*( is a * builtin)) case ${what[(w)1]} in
(compctl) man zshcompctl ;;
(comp*) man zshcompwid ;;
(bindkey|vared|zle) man zshzle ;;
(*setopt) man zshoptions ;;
(cap|getcap|setcap) ;&
(clone) ;&
(ln|mkdir|mv|rm|rmdir|sync) ;&
(sched) ;&
(echotc|echoti|sched|stat|zprof|zpty|zsocket|zstyle|ztcp) man zshmodules ;;
(zftp) man zshftpsys ;;
(*) man zshbuiltins ;;
esac ;;
(*( is hashed to *)) man ${what[(w)-1]:t} ;;
(*( is a reserved word)) man zshmisc ;;
(*) if ((! didman++))
then
if whence "run-help-$1:t" > /dev/null
then
local cmd_args
builtin getln cmd_args
builtin print -z "$cmd_args"
cmd_args=(${(z)cmd_args})
while [[ $cmd_args[1] != ${run_help_orig_cmd:-$1} ]]
do
shift cmd_args || return 1
done
eval "run-help-$1:t ${(q@)cmd_args[2,-1]}"
else
POSIXLY_CORRECT=1 man $@:t
fi
fi ;;
esac
if ((i < $#places && ! didman))
then
builtin print -nP "%SPress any key for more help or q to quit%s"
builtin read -k what
[[ $what != $newline ]] && echo
[[ $what == [qQ] ]] && break
fi
done
} always {
unset run_help_orig_cmd
}
}
소스 코드는 다음에서 제공됩니다./usr/share/zsh/functions/Misc/run-help
run-help () {
emulate -RL zsh
local HELPDIR=${HELPDIR:-/usr/share/zsh/help}
[[ $1 == "." ]] && 1="dot"
[[ $1 == ":" ]] && 1="colon"
if [[ $# == 0 || $1 == "-l" ]]
then
if [[ -d $HELPDIR ]]
then
echo "Here is a list of topics for which special help is available:"
echo ""
print -rc $HELPDIR/*(:t)
else
echo "There is no list of special help topics available at this time."
fi
return 0
elif [[ -n "${HELPDIR:-}" && -r $HELPDIR/$1 && $1 != compctl ]]
then
${=PAGER:-/usr/bin/pager} $HELPDIR/$1
return $?
fi
local what places noalias newline='
'
integer i=0 didman=0
places=("${(@f)$(builtin whence -va $1)}")
if [[ $places = *"not found"* && $1 != ${(Q)1} ]]
then
places=("${(@f)$(builtin whence -va ${(Q)1})}")
if (( ${#places} ))
then
set -- "${(Q)@}"
fi
noalias=1
fi
{
while ((i++ < $#places))
do
what=$places[$i]
[[ -n $noalias && $what = *" is an alias "* ]] && continue
builtin print -r $what
case $what in
(*( is an alias for (noglob|nocorrect))*) [[ ${what[(w)7]:t} != ${what[(w)1]} ]] && run_help_orig_cmd=${what[(w)1]} run-help ${what[(w)7]:t} ;;
(*( is an alias)*) [[ ${what[(w)6]:t} != ${what[(w)1]} ]] && run_help_orig_cmd=${what[(w)1]} run-help ${what[(w)6]:t} ;;
(*( is a * function)) case ${what[(w)1]} in
(comp*) man zshcompsys ;;
(zf*) man zshftpsys ;;
(run-help) man zshcontrib ;;
(*) builtin functions ${what[(w)1]} | ${=PAGER:-/usr/bin/pager} ;;
esac ;;
(*( is a * builtin)) case ${what[(w)1]} in
(compctl) man zshcompctl ;;
(comp*) man zshcompwid ;;
(bindkey|vared|zle) man zshzle ;;
(*setopt) man zshoptions ;;
(cap|getcap|setcap) ;&
(clone) ;&
(ln|mkdir|mv|rm|rmdir|sync) ;&
(sched) ;&
(echotc|echoti|sched|stat|zprof|zpty|zsocket|zstyle|ztcp) man zshmodules ;;
(zftp) man zshftpsys ;;
(*) man zshbuiltins ;;
esac ;;
(*( is hashed to *)) man ${what[(w)-1]:t} ;;
(*( is a reserved word)) man zshmisc ;;
(*) if ((! didman++))
then
if whence "run-help-$1:t" > /dev/null
then
local cmd_args
builtin getln cmd_args
builtin print -z "$cmd_args"
cmd_args=(${(z)cmd_args})
while [[ $cmd_args[1] != ${run_help_orig_cmd:-$1} ]]
do
shift cmd_args || return 1
done
eval "run-help-$1:t ${(q@)cmd_args[2,-1]}"
else
POSIXLY_CORRECT=1 man $@:t
fi
fi ;;
esac
if ((i < $#places && ! didman))
then
builtin print -nP "%SPress any key for more help or q to quit%s"
builtin read -k what
[[ $what != $newline ]] && echo
[[ $what == [qQ] ]] && break
fi
done
} always {
unset run_help_orig_cmd
}
}
diff first second
3c3
< local HELPDIR="${HELPDIR:-/usr/share/zsh/5.8/help}"
---
> local HELPDIR=${HELPDIR:-/usr/share/zsh/help}
19c19
< ${=PAGER:-more} $HELPDIR/$1
---
> ${=PAGER:-/usr/bin/pager} $HELPDIR/$1
48c48
< (*) builtin functions ${what[(w)1]} | ${=PAGER:-more} ;;
---
> (*) builtin functions ${what[(w)1]} | ${=PAGER:-/usr/bin/pager} ;;
첫 번째 것이 more
및 에 어떻게 의존하는지 확인하세요 /usr/share/zsh/5.8/help
. 이 디렉토리는 내 시스템에도 없습니다 help
./usr/share/zsh/5.8
내가 어떻게 "수정"했는지
처음에 echo 문을 추가하여 수정 했습니다 /usr/share/zsh/functions/Misc/run-help
(제거한 후에는 파일 수정으로 어쨌든 문제가 해결된 것 같습니다). 그 후 매번 디스크에서 올바른 버전을 로드하기 시작했습니다.
질문
그 이유를 알고 계십니까? 내가 뭐 놓친 거 없니?
답변1
zsh가 함수 코드를 로드할 때 가능한 경우 컴파일된 코드가 포함된 파일을 로드하고, 그렇지 않으면 소스 코드를 읽습니다. 컴파일된 코드는 또는 /usr/share/zsh/functions/Misc/run-help.zwc
에 있습니다 /usr/share/zsh/functions/Misc.zwc
. 보다기능 매뉴얼 자동 로딩자세한 내용은.
zsh 는 run-help
. run-help.zwc
따라서 수정 /usr/share/zsh/functions/Misc
(어떤 방식으로든 가짜 수정이라도 touch
)으로 문제가 해결되었습니다. 그런데 …/Misc.zwc
컴파일된 파일이 디렉터리 범위인 경우 문제가 해결되지 않습니다.
zsh를 업그레이드하신 것 같습니다. 일반적으로 설치 프로세스에서 컴파일된 파일을 생성하는 경우 업그레이드 프로세스에서는 이러한 컴파일된 파일을 업데이트해야 합니다. 하지만 어떤 이유로 업그레이드 프로세스가 제대로 작동하지 않습니다.
업그레이드된 버전을 설치하면 수정 시간이 패키지가 빌드된 시스템에서 파일이 마지막으로 수정된 날짜인 파일이 설치됩니다. 이 날짜는 파일이 생성된 날짜( .zwc
컴퓨터에 이전 버전의 zsh를 설치한 날짜일 수 있음)보다 이전일 수 있습니다.
zsh를 완전히 제거하고 다시 설치하거나 모든 기능이 영향을 받을 수 있으므로 다시 컴파일해야 run-help
할 수도 있습니다.zcompile
이를 위해 내장되었습니다. 설치는 아래에서 이루어지므로 /usr
루트로 설치해야 합니다. zsh는 아래에 설치되어 있으므로 /usr
배포판에서 이를 처리해야 하며 이 작업을 수동으로 수행하면 배포판의 기능이 중단될 수 있습니다.