Carregue o ambiente RVM na Tela e ZSH

2

Este tópico tem me deixado louco por um tempo agora, e gostaria de poder descobrir o que está errado. Eu uso zsh com screen no meu terminal e tenho sido por um tempo. No entanto, por qualquer motivo, parece que no login, minha instalação de RVM não é carregada por padrão. Ruby está configurado corretamente para a versão instalada pelo RVM (1.9.3), mas o restante do ambiente não é carregado:

~/Desktop => ruby -v
ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-darwin11.2.0]
~/Desktop => rails -v
Rails is not currently installed on this system. To get the latest version, simply type:

    $ sudo gem install rails

You can then rerun your "rails" command.
~/Desktop => rvm reload
RVM reloaded!
~/Desktop => rails -v
Rails 3.2.1

Eu não tenho idéia do que está errado, e, de qualquer forma, não parece que alguma coisa deva dar errado. Meu arquivo screenrc usa corretamente o shell de login com shell -$SHELL , mas não parece ter nenhum efeito (infelizmente, essa é a única coisa que parece ter corrigido as instalações de RVM de outras pessoas dentro de screen , e é o que os documentos sugerem ter certeza de que você definiu, mas não parece fazer diferença para mim).

Estou executando no Mac OS X 10.7.3 e meu shell de login está definido como /bin/zsh . Eu não uso oh-my-zsh . Meu arquivo zshrc é o seguinte (desculpe sobre o tamanho - tenho certeza de que não todos é relevante, mas eu não quero deixar nenhuma informação potencialmente útil):

# -----------------------------------------------
# Screen
# -----------------------------------------------

if [[ $TERM != 'screen' ]]; then
  exec screen -aADRU
fi

# -----------------------------------------------
# Startup Scripts
# -----------------------------------------------

[[ -s ~/.rvm/scripts/rvm ]] && source ~/.rvm/scripts/rvm
cd ~/Desktop

# -----------------------------------------------
# Environment Variables
# -----------------------------------------------

export HISTFILE=~/.zsh_history
export HISTSIZE=10000
export HISTCONTROL=ignoredups
export SAVEHIST=10000

export PATH=.:~/.rvm/bin:/usr/local/bin:/usr/local/sbin:~/Library/Haskell/bin:/usr/local/narwhal/bin:/bin:/sbin:/usr/bin:/usr/local/share:/usr/sbin:/usr/local/texlive/2011/bin/universal-darwin
export CC=/usr/bin/clang
export EDITOR='vim'
export GIT_EDITOR="mate --name 'Git Commit Message' -wd -l 1"
export LC_TYPE=en_US.UTF-8
export CLICOLOR=AxFxcxdxBxegbdHbGgcdBd
export NODE_PATH=/usr/local/lib/node/:$NODE_PATH
export CAPP_BUILD="/Users/itaiferber/Desktop/Cappuccino Build"
export NARWHAL_ENGINE=jsc

# -----------------------------------------------
# Prompt
# -----------------------------------------------

## Root Prompt
[ $UID = 0 ] && export PROMPT="%~ +=> " && export RPROMPT="%*"

## General Prompt
[ $UID != 0 ] && export PROMPT="%~ => " && export RPROMPT="%*"

# -----------------------------------------------
# Aliases
# -----------------------------------------------

## Command Aliases
alias ..='cd ..'
alias ...='cd ../..'
alias internet='lsof -P -i -n | cut -f 1 -d " " | uniq'
alias restart='sudo shutdown -r NOW'
alias ls='ls -AFGp'
alias tree='tree -alCF --charset=UTF-8 --du --si'
alias zshrc='$=EDITOR ~/.zshrc && source ~/.zshrc'
alias rake='noglob rake'

## Root Aliases
[ $UID = 0 ] &&       \
  alias rm='rm -i' && \
  alias mv='mv -i' && \
  alias cp='cp -i'

# -----------------------------------------------
# User-defined Functions
# -----------------------------------------------

# Usage: rm <file>
# Description: move files to trash instead of deleting them outright.
# Note: this will move files to the trash as long as no flags are set.
#       If a flag is encountered, it will rm the files normally.
rm () {
  local path
  for path in "$@"; do
    if [[ "$path" = -* ]]; then
      /bin/rm $@
      break
    else
      local dst=${path##*/}
      while [ -e ~/.Trash/"$dst" ]; do
        dst="$dst "$(/bin/date +%H-%M-%S)
      done
      /bin/mv "$path" ~/.Trash/"$dst"
    fi
  done
}

# Usage: extract <file>
# Description: extracts archived files / mounts disk images.
# Note: .dmg/hdiutil is Mac OS X-specific.
extract () {
  if [ -f $1 ]; then
    case $1 in
      *.tar.bz2)  tar -jxvf $1      ;;
      *.tar.gz)   tar -zxvf $1      ;;
      *.bz2)      bunzip2 $1        ;;
      *.dmg)      hdiutul mount $1  ;;
      *.gz)       gunzip $1         ;;
      *.tar)      tar -xvf $1       ;;
      *.tbz2)     tar -jxvf $1      ;;
      *.tgz)      tar -zxvf $1      ;;
      *.zip)      unzip $1          ;;
      *.Z)        uncompress $1     ;;
      *)          echo "'$1' cannot be extracted/mounted via extract()." ;;
    esac
  else
    echo "'$1' is not a valid file."
  fi
}

# Usage: pman <manpage>
# Description: opens up the selected man page in Preview.
pman () {
  man -t $@ | open -f -a /Applications/Preview.app
}

# Usage: pid <processname>
# Description: returns the pid of the first process with the given name.
pid () {
  ps Ao pid,comm | grep -im1 $1 | awk '{match($0,/([0-9]+)/); print substr($0,RSTART,RLENGTH);}'
}

# Usage: relaunch <appname>
# Description: quits and relaunches the app with the given name.
relaunch () {
  kill 'pid $1'; open -a $1
}

# Usage: inject <processname>
# Description: uses StarInject to inject code into the first process with the given name.
inject () {
  StarInject 'pid $1'
}

# Usage: fp <name>
# Description: find and list processes matching a case-insensitive partial-match string.
fp () {
  ps Ao pid,comm | awk '{match($0,/[^\/]+$/); print substr($0,RSTART,RLENGTH)": "$1}' | grep -i $1 | grep -v grep
}

# Usage: fk <name>
# Description: find and kill a process matching a case-insensitive partial-match string.
fk () {
  IFS=$'\n'
  PS3='Kill which process? (1 to cancel): '
  select OPT in "Cancel" $(fp $1); do
    if [ $OPT != "Cancel" ]; then
      kill $(echo $OPT|awk '{print $NF}')
    fi
    break
  done
  unset IFS
}

# Usage: console <processname>
# Description: get the latest logs for the given process names.
console () {
  if [[ $# > 0 ]]; then
    query=$(echo "$*"|tr -s ' ' '|')
    tail -f /var/log/system.log | grep -i --color=auto -E "$query"
  else
    tail -f /var/log/system.log
  fi
}

# Usage: create <file>
# Description: creates and opens a file for editing.
create () {
  touch $1 && $=EDITOR $1
}

# Usage: reset
# Description: 'resets' the terminal by changing the current working directory
# to the desktop and clearing the screen.
reset () {
  cd ~/Desktop && clear
}

# -----------------------------------------------
# zsh Options
# -----------------------------------------------

# Directories
setopt              \
  AUTO_CD           \
  AUTO_PUSHD        \
  CD_ABLE_VARS      \
  CHASE_DOTS        \
  CHASE_LINKS

# Completion
setopt              \
  AUTO_LIST         \
  AUTO_MENU         \
  AUTO_PARAM_SLASH  \
  COMPLETE_IN_WORD  \
  LIST_TYPES        \
  MENU_COMPLETE     \
  REC_EXACT

# History
setopt              \
  APPEND_HISTORY    \
  EXTENDED_HISTORY

# Input/Output
setopt              \
  CORRECT

# Scripts and Functions
setopt              \
  MULTIOS

# Other
setopt              \
  NO_BEEP           \
  ZLE

# Key Bindings
bindkey "^[[3~" delete-char

# -----------------------------------------------
# zsh Autocompletion
# -----------------------------------------------

# Turn on auto-completion.
autoload -U compinit && compinit -C && autoload -U zstyle+

# Attempt to complete as much as possible.
zstyle ':completion:*' completer _complete _list _oldlist _expand _ignored _match _correct
zstyle ':completion:*::::' completer _expand _complete _ignored _approximate

# Sort files by name.
zstyle ':completion:*' file-sort name

# Allow for case-insensitive completion.
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'

# Color completions.
zstyle ':completion:*' list-colors ${LSCOLORS}
zstyle ':completion:*:*:kill:*:processes' command 'ps -axco pid,user,command'
zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#)*=0=01;31'

# Set the amount of completions that triggers the menu.
zstyle ':completion:*' menu select=long

# Ignore certain patterns.
zstyle ':completion:*:functions' ignored-patterns '_*'
zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~'
zstyle ':completion:*:*:(^rm):*:*files' ignored-patterns '*?.(o|c~|old|pro|zwc)'

# Cache completions.
zstyle ':completion::complete:*' use-cache 1
zstyle ':completion::complete:*' cache-path ~/.zcompcache/$HOST

# Allow errors.
zstyle -e ':completion:*:approximate:*' max-errors 'reply=( $(( ($#PREFIX+$#SUFFIX)/2 )) numeric )'

# Insert all expansions for expand completer (eh, don't know what this does).
zstyle ':completion:*:expand:*' tag-order all-expansions

# Formatting and messages.
zstyle ':completion:*' list-prompt '%SAt %p: Hit TAB for more, or the character to insert%s'
zstyle ':completion:*' verbose yes
zstyle ':completion:*:descriptions' format '%B%d%b'
zstyle ':completion:*:messages' format '%d'
zstyle ':completion:*:warnings' format 'No matches for: %d'
zstyle ':completion:*:corrections' format '%B%d (errors: %e)%b'
zstyle ':completion:*' group-name ''

# Offer indexes before parameters in subscripts.
zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters

Além disso, meu arquivo screenrc é o seguinte:

# Use login shell.
shell -$SHELL

# Don't display the copyright page.
startup_message off

# Escapes the 'z' character, instead of 'c'.
escape ^Zz

# Set up the tab bar.
caption always              "%?%F%{=u ..}%? %h %-024=%{+b}"
hardstatus alwayslastline   "%{= ..} %-w%{=b ..} %n* %t %{-}%+w %=%{= ..}"

O mais estranho de tudo, no entanto, é que quando eu mudo minha linha de sourcing RVM para [[ -s ~/.rvm/scripts/rvm ]] && source ~/.rvm/scripts/rvm && rvm reload , vejo a mensagem RVM reloaded! , mas o ambiente ainda não está configurado. rails não é reconhecido até que eu recarregue o RVM novamente.

Qualquer ajuda com isso seria muito apreciada. Obrigado!

    
por Itai Ferber 17.02.2012 / 17:18

2 respostas

2

Depois de um pouco de ajustes, rvm finalmente carrega seu ambiente com sucesso por padrão. Agora, eu não sei exatamente qual parte do que eu fiz resolveu o problema, mas espero que isso ajude alguém.

Essencialmente, eu passei e dividi minha configuração de zsh em dois arquivos: o arquivo .zshenv (que é carregado por todos os programas) e o arquivo .zshrc (que é carregado por programas gráficos). Para aqueles que não estão familiarizados com o funcionamento do zsh , esses arquivos são essencialmente análogos a .bash_profile e .bashrc .

Meu .zshenv :

# -------------------------------------------------------------
# Maintainer: Itai Ferber
#             http://itaiferber.net - [email protected]
#
# Version: 1.0 - 19/02/12
#
# Sections:
# -> RVM
# -> Environment Variables
# -> Aliases
# -> File Manipulation
# -> Process Manipulation
# -> Terminal Manipulation
# -> zsh Options
#
# Revisions:
# -> 1.0.0: Initial revision (settings copied over from .zshrc where logical).
# -------------------------------------------------------------

# -------------------------------------------------------------
# => RVM
# -------------------------------------------------------------
[[ -s ~/.rvm/scripts/rvm ]] && source ~/.rvm/scripts/rvm

# -------------------------------------------------------------
# => Environment Variables
# -------------------------------------------------------------
# Path
export PATH=.:~/.rvm/bin:/usr/local/bin:/usr/local/sbin:~/Library/Haskell/bin:/usr/local/texlive/2011/bin/universal-darwin:/usr/local/narwhal/bin:$PATH

# History
export HISTFILE=~/dotfiles/.zsh_history
export HISTSIZE=10000
export HISTCONTROL=ignoredups
export SAVEHIST=10000

# Editor
export EDITOR=vim

# Localization
export LC_TYPE=en_US.UTF-8

# Frameworks
export NODE_PATH=/usr/local/lib/node/:$NODE_PATH
export CAPP_BUILD='/Users/itaiferber/Desktop/Cappuccino Build'
export NARWHAL_ENGINE=jsc

# -------------------------------------------------------------
# => Aliases
# -------------------------------------------------------------
# Command Aliases
alias ..='cd ..'
alias ...='cd ../..'
alias internet='lsof -inP | cut -f 1 -d " " | uniq'
alias restart='sudo shutdown -r NOW'

# Expansions
alias ls='ls -AFGp'
alias tree='tree -aCFl --charset=UTF8 --du --si'

# Root Aliases
[ $UID = 0 ] && \
    alias rm='rm -i' && \
    alias mv='mv -i' && \
    alias cp='cp -i'

# -------------------------------------------------------------
# => Terminal Manipulation
# -------------------------------------------------------------
# Usage: reset
# Description: 'resets' the terminal by clearing and returning to default directory
reset () {
    cd ~/Desktop && clear
}

# -------------------------------------------------------------
# => Process Manipulation
# -------------------------------------------------------------
# Usage: pid <procname>
# Description: returns the pid of the process with the given name
# Notes: if multiple processes with the given name are running, no guarantee is made to which pid is returned
pid () {
    ps Ao pid,comm | grep -im1 $1 | awk '{match($0,/([0-9]+)/); print substr($0,RSTART,RLENGTH);}'
}

# Usage: fp <pattern>
# Description: list processes matching the given partial-match pattern
fp () {
    ps Ao pid,comm | awk '{match($0,/[^\/]+$/); print substr($0,RSTART,RLENGTH)": "$1}' | grep -i $1 | grep -v grep
}

# Usage: fk <pattern>
# Description: list process matching the given partial-match pattern to kill
fk () {
    IFS=$'\n'
    PS3='Kill which process? (1 to cancel): '
    select OPT in 'Cancel' $(fp $1); do
        if [ $OPT != 'Cancel' ]; then
            kill $(echo $OPT | awk '{print $NF}')
        fi
        break
    done
    unset IFS
    unset PS3
}

# Usage: console <procname>
# Description: get the latest logs for the given process name
console () {
    if [[ $# > 0 ]]; then
        query=$(echo "$*" | tr - s ' ' '|')
        tail -f /var/log/system.log | grep -i --color=auto -E "$query"
    else
        tail -f /var/log/system.log
    fi
}

# -------------------------------------------------------------
# => File Manipulation
# -------------------------------------------------------------
# Usage: rm <file>
# Description: if called with no arguments, move files to trash instead of deleting outright
rm () {
    local path
    for path in "$@"; do
        if [[ "$path" = -* ]]; then
            /bin/rm $@
            break
        else
            local file=${path##*/}
            while [ -e ~/.Trash/"$file" ]; do
                file="$file "$(date +%H-%M-%S)
            done
            /bin/mv "$path" ~/.Trash/"$file"
        fi
    done
}

# Usage: extract <file>
# Description: extracts archived files / mounts disk images
extract () {
    if [ -f $1 ]; then
        case $1 in
            *.bz2) bunzip2 $1;;
            *.dmg) hdiutil mount $1;;
            *.gz) gunzip $1;;
            *.tar) tar -xvf $1;;
            *.tar.bz2|*.tbz2) tar -jxvf $1;;
            *.tar.gz|*.tgz) tar -zxvf $1;;
            *.zip) unzip $1;;
            *.Z) uncompress $1;;
            *) echo "'$1' not recognized.";;
        esac
    else
        echo "'$1' not found."
    fi
}

# -------------------------------------------------------------
# => zsh Options
# -------------------------------------------------------------
# Directories
setopt AUTO_CD AUTO_PUSHD CD_ABLE_VARS CHASE_DOTS CHASE_LINKS

# Completion
setopt AUTO_LIST AUTO_MENU AUTO_PARAM_SLASH COMPLETE_IN_WORD LIST_TYPES MENU_COMPLETE REC_EXACT

# History
setopt APPEND_HISTORY EXTENDED_HISTORY

# Input/Output
setopt CORRECT

# Scripts and Functions
setopt MULTIOS

# Other
setopt NO_BEEP ZLE

# Key Bindings
bindkey "^[[3~" delete-char

Meu .zshrc :

# -------------------------------------------------------------
#  Maintainer: Itai Ferber
#              http://itaiferber.net - [email protected]
#
#  Version: 1.0 - 19/02/12
#
#  Sections:
#  -> zshenv
#  -> screen
#  -> Environment Variables
#  -> Prompt
#  -> zsh Autocompletion
#
#  Revisions:
#  -> 1.0.0: Initial revision. Style copied from vimrc.
# -------------------------------------------------------------

# -------------------------------------------------------------
# => zshenv
# -------------------------------------------------------------
source ~/.zshenv

# -------------------------------------------------------------
# => screen
# -------------------------------------------------------------
if [[ $TERM != 'screen' ]]; then
    exec screen -aADRU
fi

reset

# -------------------------------------------------------------
# => Environment Variables
# -------------------------------------------------------------
export TERM=xterm-256color
export CLICOLOR=AxFxcxdxBxegbdHbGgcdBd

# -------------------------------------------------------------
# => Prompt
# -------------------------------------------------------------
if [[ $UID = 0 ]]; then
    export PROMPT="%~ +=> "
else
    export PROMPT="%~ => "
fi

export RPROMPT="%*"

# -------------------------------------------------------------
# => zsh Autocompletion
# -------------------------------------------------------------
# Enable autocompletion.
autoload -U compinit && compinit -C && autoload -U zstyle+

# Attempt to complete as much as possible.
zstyle ':completion:*' completer _complete _list _oldlist _expand _ignored _match _correct
zstyle ':completion:*::::' completer _expand _complete _ignored _approximate

# Sort files by name.
zstyle ':completion:*' file-sort name

# Allow for case-insensitive completion.
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'

# Color completions.
zstyle ':completion:*' list-colors ${CLICOLOR}
zstyle ':completion:*:*:kill:*:processes' command 'ps -axco pid,user,command'
zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#)*=0=01;31'

# Set the amount of completions that triggers the menu.
zstyle ':completion:*' menu select=long

# Ignore certain patterns.
zstyle ':completion:*:functions' ignored-patterns '_*'
zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~'
zstyle ':completion:*:*:(^rm):*:*files' ignored-patterns '*?.(o|c~|old|pro|zwc)'

# Cache completions.
zstyle ':completion::complete:*' use-cache 1
zstyle ':completion::complete:*' cache-path ~/.zcompcache/$HOST

# Allow errors.
zstyle -e ':completion:*:approximate:*' max-errors 'reply=( $(( ($#PREFIX+$#SUFFIX)/2 )) numeric )'

# Insert all expansions for expand completer (eh, don't know what this does).
zstyle ':completion:*:expand:*' tag-order all-expansions

# Formatting and messages.
zstyle ':completion:*' list-prompt '%SAt %p: Hit TAB for more, or the character to insert%s'
zstyle ':completion:*' verbose yes
zstyle ':completion:*:descriptions' format '%B%d%b'
zstyle ':completion:*:messages' format '%d'
zstyle ':completion:*:warnings' format 'No matches for: %d'
zstyle ':completion:*:corrections' format '%B%d (errors: %e)%b'
zstyle ':completion:*' group-name ''

# Offer indexes before parameters in subscripts.
zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters

Espero que isso sirva como um pequeno guia para alertar qualquer outra pessoa que tenha os mesmos problemas que eu tive.

    
por 20.02.2012 / 05:33
0

Este é um grande truque, mas eu coloquei esta linha em .bashrc , bem como em .bash_profile :

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function* 

Com isso, rvm use 1.93 e comandos semelhantes funcionaram nos prompts normais e na tela, não dando mais o erro rvm is not a function . Enquanto este trecho é idempotente (ou seja, não tem efeitos negativos devido a ser invocado duas vezes ou N vezes), isso deve ser ok. E, dado que é invocado em todos os shell de login, isso provavelmente é verdade. Mas vamos ver se é esse o caso ...

    
por 07.03.2013 / 06:37