ロードされたランタイムヘルプ関数コードがディスクの実際のソースコードと一致しません。

ロードされたランタイムヘルプ関数コードがディスクの実際のソースコードと一致しません。

run-helpzshのインストールから始めて(zshセクションの1つ)などのコマンドのマニュアルページが開きます。最近、関数のソースコードを調べたところ、ほとんどのzshコマンド/組み込みコマンドのヘルプはすでにポケットベルを使用して開いている必要があることがわかりました。 printを使用して関数の実際のコードをロードした後、実際のソースコードとは異なることがわかりました。typesetautoload/usr/share/zsh/functions/Misc/run-helpfunctions run-help

2つのバージョンとの違いは次のとおりです。 2番目のバージョン(ソースコード)もfunctions run-helpIの後に出力されます。少し問題を解決しました。

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-helprun-help.zwcしたがって、修正/usr/share/zsh/functions/Misc(何らかの方法で偽の修正でもtouch)で問題が解決されました。ただし、…/Misc.zwcコンパイルされたファイルがディレクトリ範囲の場合、問題は解決されません。

zshをアップグレードしたようです。通常、インストールプロセスでコンパイルされたファイルを生成する場合、アップグレードプロセスはこれらのコンパイル済みファイルを更新する必要があります。ただし、何らかの理由でアップグレードプロセスが正しく機能しません。

アップグレードされたバージョンをインストールすると、パッケージがビルドされたシステムで変更時刻がファイルに最後に変更された日付であるファイルがインストールされます。この日付は、ファイルが作成された日付より前のバージョンである可能性があります(.zwcコンピューターに以前のバージョンのzshをインストールした日付である可能性があります)。

zshを完全に削除して再インストールするか、すべての機能が影響を受ける可能性があるため、再コンパイルする必要がrun-helpあります。zcompileこのために組み込まれています。インストールは以下で行われますので、rootとしてインストールする必要が/usrあります。 zsh は以下にインストールされているため、ディストリビュー/usrションでこれを処理する必要があります。これを手動で実行すると、ディストリビューションの機能が中断される可能性があります。

関連情報