🔙 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 する.

æˆæžœį‰Šã¯æŦĄãŽã¨ãŠã‚Šã§ã™.