🔙 Back to Top

Mon Jun 25 2018

zsh ぎčĩˇå‹•ãŽå¤§åŠãŒ pyenv init だãŖたぎで遅åģļさせる

   time zsh -i -c "exit"
zsh -i -c "exit"  0.67s user 0.19s system 99% cpu 0.863 total

こんãĒį’°åĸƒã ãŖた. こぎ内ぎおよそ 0.7 į¨‹åēĻが pyenv init だãŖた. env įŗģをいくつもäŊŋãŖãĻるäēēは anyenv ãĢぞとめるぎが有劚らしいが、į§ã¯ pyenv くらいしかäŊŋãŖãĻãĒい.

å•éĄŒã¯ã€ã‚ˇã‚§ãƒĢをčĩˇå‹•ã—たからといãŖãĻいつも python をå‘ŧãļわけではãĒいということ. そぎためãĢäēēį”ŸãŽč˛´é‡ãĒ 0.7 į§’がč˛ģやされãĻいるぎがいけãĒい. というわけで python をäŊŋã†ã‚ˇã‚§ãƒĢぎ中だけで pyenv init することãĢする. python をäŊŋうかおうかをčĻ‹åˆ†ã‘ã‚‹æ–šæŗ•ã¯įĩåą€ã€ python を及くかおうかだ. あるいは pip を.

というわけでæŦĄãŽã‚ˆã†ãĒč§Ŗæąēæŗ•ã‚’ææĄˆã™ã‚‹:

ããŽã‚ˇã‚§ãƒĢぎ中で初めãĻ python (ぞたは pip ) を及くときãĢ pyenv init する操äŊœã‚’åˇŽã—čžŧむ

ぞずはいつも pyenv init するようãĒã‚ŗãƒŧドを pyenv-init というé–ĸ数ãĢしãĻおく. ついでãĢ pyenv č‡ĒäŊ“へぎパ゚を通すとかも一įˇ’ãĢしãĻる. あと pyenv をå…ĨれãĻãĒいį’°åĸƒã§ã‚‚æ­ģãĒãĒいようãĢするとかしãĻる (すずãĻぎį’°åĸƒã§åŒä¸€ãŽč¨­åŽšãƒ•ã‚Ąã‚¤ãƒĢを遊į”¨ã—たいぎで、į§ã¯).

pyenv-init() {
    if [ -d ~/.pyenv ]; then
        export PYENV_ROOT="$HOME/.pyenv"
        export PATH="$HOME/.pyenv/bin:$PATH"
        [ -d $PYENV_ROOT ] && eval "$(pyenv init -)"
    fi
}

これを python をå‘ŧんだらå‘ŧばせたい. python というé–ĸ数で厚įžŠã™ã‚‹ã¨æŦĄãŽã‚ˆã†ãĢãĒる.

python() {
    pyenv-init
    command python "$@"
}

中で python をå‘ŧãļぎãĢ、åŧ•æ•°ã‚’ããŽãžãžæ¸Ąã™ãŽãĢ $@ を与えãĻるぎと、 あと同一名ぎé–ĸ数をäģŠåŽšįžŠã—たぎで、再帰å‘ŧãŗå‡ēしでį„Ąé™ãƒĢãƒŧプãĢãĒらãĒいようãĢ command というã‚ŗマãƒŗドをäŊŋãŖãĻる.

ところでこれだと、python をå‘ŧãļたãŗãĢ pyenv-init がčĩ°ãŖãĻしぞう. 一回čĩ°ã‚‰ã›ãĻしぞãŖたらもう不čĻãĒぎで、čĩ°ã‚‰ã›ãŸã‹ãŠã†ã‹ã‚’フナグとしãĻ持ãŖãĻおくåŋ…čĻãŒã‚ã‚‹. į°Ąå˜ãĒæ–šæŗ•ã¨ã—ãĻは python というé–ĸ数が存在するかをフナグãĢしãĻしぞうことだ. åˆã‚ã¯č¨­åŽšãƒ•ã‚Ąã‚¤ãƒĢぎ中で上ãĢ書いたようãĒ python というé–ĸ数が厚įžŠã—ãĻ存在するぎで、ぞだ pyenv-init はčĩ°ãŖãĻいãĒい. python をå‘ŧãļとé–ĸ数が存在するぎで python é–ĸ数がå‘ŧばれる. äģŠã€ python é–ĸ数ぎ中ãĢ python é–ĸ数を削除するという操äŊœã‚’čŋŊ加することãĢする. するとæŦĄå›žį§ģčĄŒã€python をå‘ŧãļとé–ĸ数が存在しãĒã„ãŽã§åŽŸčĄŒãƒ•ã‚Ąã‚¤ãƒĢとしãĻぎ python をčĻ‹ã¤ã‘ãĻãã‚Œã‚’åŽŸčĄŒã™ã‚‹ã“ã¨ãĢãĒる. そぎときãĢはæ—ĸãĢ pyenv-init ã¯åŽŸčĄŒæ¸ˆãŋであることがäŋč¨ŧされãĻいる.

というわけでæŦĄãŽã‚ˆã†ãĢする

python() {
    pyenv-init
    unfunction python
    python "$@"
}

unfunction ã‚’åŽŸčĄŒã—ãŸæ™‚į‚šã§ python というé–ĸ数は存在しãĒい. ãĒぎで command をäģ˜ã‘ãĒくãĻももはや再帰å‘ŧå‡ēしではãĒくãĒãŖãĻいる.

python と同様ぎことを pip ãĢもäŊœãŖãĻあげる. そしãĻこぎ場合、python ぞたは pip を一åēĻでもå‘ŧんだら pyenv-init は不čĻãĒぎで、 ä¸Ąæ–šå…ąã‚’ unfunction する.

成果į‰Šã¯æŦĄãŽã¨ãŠã‚Šã§ã™.