Загрузка среды RVM в Screen и ZSH
Эта тема уже давно сводит меня с ума, и я бы хотел выяснить, что происходит не так. я использую zsh
с screen
в моем терминале, и были в течение некоторого времени. Однако, по какой-то причине, кажется, что при входе в систему моя установка RVM
не загружается по умолчанию. Для Ruby правильно установлена версия, установленная RVM (1.9.3), но остальная среда не загружается:
~/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
Я понятия не имею, что происходит не так, и, судя по всему, кажется, что все идет не так. мой screenrc
файл правильно использует оболочку входа с shell -$SHELL
, но это, кажется, не имеет никакого эффекта (к сожалению, это единственное, что, кажется, исправило установки RVM других людей в screen
, и это то, что доктора предлагают убедиться, что вы установили, но это, кажется, не имеет значения для меня).
Я работаю на Mac OS X 10.7.3, и моя оболочка входа установлена в /bin/zsh
, Я не пользуюсь oh-my-zsh
, мой zshrc
файл выглядит следующим образом (извините за длину - я уверен, что не все это относится к делу, но я не хочу опускать потенциально полезную информацию):
# -----------------------------------------------
# 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
Кроме того, мой screenrc
Файл выглядит следующим образом:
# 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 %=%{= ..}"
Самое странное, однако, это то, что когда я меняю свою линию источников RVM на [[ -s ~/.rvm/scripts/rvm ]] && source ~/.rvm/scripts/rvm && rvm reload
Я вижу сообщение RVM reloaded!
, но среда все еще не настроена. rails
не распознается, пока я не перезагружу RVM снова.
Любая помощь с этим будет высоко ценится. Спасибо!
2 ответа
После долгого возни, rvm
наконец-то успешно загружает свою среду по умолчанию. Теперь я не знаю точно, какая часть того, что я сделал, исправила проблему, но, надеюсь, это кому-то поможет.
По сути, я прошел и разделил zsh
Конфигурация в два файла: .zshenv
файл (который загружается всеми программами) и .zshrc
файл (который загружается графическими программами). Для тех, кто не знает, как zsh
работает, эти файлы по сути являются аналогами .bash_profile
а также .bashrc
,
мой .zshenv
:
# -------------------------------------------------------------
# Maintainer: Itai Ferber
# http://itaiferber.net - hi@itaiferber.net
#
# 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
мой .zshrc
:
# -------------------------------------------------------------
# Maintainer: Itai Ferber
# http://itaiferber.net - hi@itaiferber.net
#
# 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
Надеюсь, это может послужить небольшим руководством, чтобы предупредить кого-либо еще, кто сталкивался с теми же проблемами, что и я.
Это огромный взлом, но я просто вставил эту строку в .bashrc
а также в .bash_profile
:
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*
С этим, rvm use 1.93
и аналогичные команды работали как на обычных, так и на экранных подсказках, больше не давая rvm is not a function
ошибка. Пока этот фрагмент идемпотентен (то есть не имеет вредных воздействий из-за того, что вызывается дважды или N раз), все должно быть в порядке. И, учитывая, что он все равно вызывается в каждой оболочке входа в систему, это, вероятно, верно. Но давайте посмотрим, если это так...