run-help
zshのインストールから始めて(zshセクションの1つ)などのコマンドのマニュアルページが開きます。最近、関数のソースコードを調べたところ、ほとんどのzshコマンド/組み込みコマンドのヘルプはすでにポケットベルを使用して開いている必要があることがわかりました。 printを使用して関数の実際のコードをロードした後、実際のソースコードとは異なることがわかりました。typeset
autoload
/usr/share/zsh/functions/Misc/run-help
functions run-help
2つのバージョンとの違いは次のとおりです。 2番目のバージョン(ソースコード)も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
このために組み込まれています。インストールは以下で行われますので、rootとしてインストールする必要が/usr
あります。 zsh は以下にインストールされているため、ディストリビュー/usr
ションでこれを処理する必要があります。これを手動で実行すると、ディストリビューションの機能が中断される可能性があります。