pyenvのコンパイルによる高速化はzshでも行ってよいのか


# 概要

Wsl on Ubuntuにpyenvを導入しています。

READMEには、"Optionally, try to compile a dynamic Bash extension to speed up
Pyenv.  
Don't worry if it fails; Pyenv will still work normally:"として`cd ~/.pyenv &&
src/configure && make -C src`とありますが、zshを使っている場合にもこれを実行しても構わないんでしょうか。

# 付記

## pyenv

<https://github.com/pyenv/pyenv#basic-github-checkout>

## zsh

zsh 5.8.1 (x86_64-ubuntu-linux-gnu)

## wsl on ubuntu

PRETTY_NAME="Ubuntu 22.04.3 LTS"  
NAME="Ubuntu"  
VERSION_ID="22.04"  
VERSION="22.04.3 LTS (Jammy Jellyfish)"  
VERSION_CODENAME=jammy  
ID=ubuntu  
ID_LIKE=debian  
HOME_URL="https://www.ubuntu.com/"  
SUPPORT_URL="https://help.ubuntu.com/"  
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"  
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-
policy"  
UBUNTU_CODENAME=jammy

WSL バージョン: 1.2.5.0  
カーネル バージョン: 5.15.90.1  
WSLg バージョン: 1.0.51  
MSRDC バージョン: 1.2.3770  
Direct3D バージョン: 1.608.2-61064218  
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp  
Windows バージョン: 10.0.22621.2506



[code]

    cd ~/.pyenv && src/configure && make -C src
    
[/code]

この処理の実行で何が起こるかと言うと、`~/.pyenv/libexec/pyenv-realpath.dylib` というファイルが生成されます。これは
bash の `enable` コマンド(built-in command) で読み込む shared object です。

[code]

    $ cd ~/.pyenv && src/configure && make -C src
    make: Entering directory '/home/nemo/.pyenv/src'
    gcc -fPIC     -c -o realpath.o realpath.c
    gcc -shared -Wl,-soname,../libexec/pyenv-realpath.dylib  -o ../libexec/pyenv-realpath.dylib realpath.o 
    make: Leaving directory '/home/nemo/.pyenv/src'
    
[/code]

[pyenv/src/realpath.c at master ·
pyenv/pyenv](https://github.com/pyenv/pyenv/blob/master/src/realpath.c#L30)

[code]

    char *realpath_doc[] = {
        "Display each PATHNAME argument, resolving symbolic links. The exit status",
        "is 0 if each PATHNAME was resolved; non-zero otherwise.",
        (char *)NULL
    };
    
[/code]

`pyenv` スクリプト( **bash スクリプト** )内で、この shared object
をロードしています。ロードに失敗した場合は、外部コマンドの `readlink` が使われることになります。(`readlink`
コマンドがインストールされていない、もしくは環境変数 PATH に設定されているディレクトリに存在しない場合は `pyenv` スクリプト自体が終了)

[pyenv/libexec/pyenv at master ·
pyenv/pyenv](https://github.com/pyenv/pyenv/blob/master/libexec/pyenv#L23)

[code]

    if enable -f "${BASH_SOURCE%/*}"/../libexec/pyenv-realpath.dylib realpath 2>/dev/null; then
      abs_dirname() {
        local path
        path="$(realpath "$1")"
        echo "${path%/*}"
      }
    else
      [ -z "$PYENV_NATIVE_EXT" ] || abort "failed to load \`realpath' builtin"
    
      READLINK=$(type -P readlink)
      [ -n "$READLINK" ] || abort "cannot find readlink - are you missing GNU coreutils?"
    
               :
    
[/code]

したがって、`zsh` を使っていても問題ありません。(というより、ログインシェルは無関係です)



[code]

    cd ~/.pyenv && src/configure && make -C src
    
[/code]

この処理の実行で何が起こるかと言うと、`~/.pyenv/libexec/pyenv-realpath.dylib` というファイルが生成されます。これは
bash の `enable` コマンド(built-in command) で読み込む shared object です。

[code]

    $ cd ~/.pyenv && src/configure && make -C src
    make: Entering directory '/home/nemo/.pyenv/src'
    gcc -fPIC     -c -o realpath.o realpath.c
    gcc -shared -Wl,-soname,../libexec/pyenv-realpath.dylib  -o ../libexec/pyenv-realpath.dylib realpath.o 
    make: Leaving directory '/home/nemo/.pyenv/src'
    
[/code]

[pyenv/src/realpath.c at master ·
pyenv/pyenv](https://github.com/pyenv/pyenv/blob/master/src/realpath.c#L30)

[code]

    char *realpath_doc[] = {
        "Display each PATHNAME argument, resolving symbolic links. The exit status",
        "is 0 if each PATHNAME was resolved; non-zero otherwise.",
        (char *)NULL
    };
    
[/code]

`pyenv` スクリプト( **bash スクリプト** )内で、この shared object
をロードしています。ロードに失敗した場合は、外部コマンドの `readlink` が使われることになります。(`readlink`
コマンドがインストールされていない、もしくは環境変数 PATH に設定されているディレクトリに存在しない場合は `pyenv` スクリプト自体が終了)

[pyenv/libexec/pyenv at master ·
pyenv/pyenv](https://github.com/pyenv/pyenv/blob/master/libexec/pyenv#L23)

[code]

    if enable -f "${BASH_SOURCE%/*}"/../libexec/pyenv-realpath.dylib realpath 2>/dev/null; then
      abs_dirname() {
        local path
        path="$(realpath "$1")"
        echo "${path%/*}"
      }
    else
      [ -z "$PYENV_NATIVE_EXT" ] || abort "failed to load \`realpath' builtin"
    
      READLINK=$(type -P readlink)
      [ -n "$READLINK" ] || abort "cannot find readlink - are you missing GNU coreutils?"
    
               :
    
[/code]

したがって、`zsh` を使っていても問題ありません。(というより、ログインシェルは無関係です)

