我正在从Fish Shell转换到Zsh。
我刚刚经历了一个漫长的过程,将我的一堆Fish函数转换成Zsh,大部分都能正常工作,但我刚刚注意到,当我输入“ls”时,它不仅无法工作,而且实际上会结束终端选项卡会话。
超级困惑,因为我没有(我不认为)做任何与该命令有关的事情。大多数其他基本命令似乎都可以正常工作。有什么想法可能会导致这种混乱吗?我已经在下面放置了我的新Zsh函数和
这些函数大多是一堆Git / Zeus(Rails工具)函数,使我的生活更轻松:
~/.oh-my-zsh/custom/plugins/functions/functions.plugin.zsh
我刚刚经历了一个漫长的过程,将我的一堆Fish函数转换成Zsh,大部分都能正常工作,但我刚刚注意到,当我输入“ls”时,它不仅无法工作,而且实际上会结束终端选项卡会话。
➜ ~ cd code
➜ code ls
[Process completed]
超级困惑,因为我没有(我不认为)做任何与该命令有关的事情。大多数其他基本命令似乎都可以正常工作。有什么想法可能会导致这种混乱吗?我已经在下面放置了我的新Zsh函数和
.zshrc
文件。这些函数大多是一堆Git / Zeus(Rails工具)函数,使我的生活更轻松:
~/.oh-my-zsh/custom/plugins/functions/functions.plugin.zsh
##############################
######### ZEUS BASED #########
##############################
z () zeus start
rmz () rm .zeus.sock
rr () {
if [ "$#" -gt 0 ]; then
r routes | grep "$@"
else
r routes
fi
}
zeus_on () {
if ps aux | grep -v grep | grep 'zeus slave: development_environment'; then
true
else
false
fi
}
mg () r db:migrate "$@"
tprep () {
if zeus_on; then
zeus rake db:test:prepare "$@"
else
echo "Zeus is not running"
rake db:test:prepare "$@"
fi
}
s () {
if zeus_on; then
zeus s
else
echo "Zeus is not running"
rails s
fi
}
t () {
if zeus_on; then
if [ '$#' -gt 0 ]; then
zeus test "$@"
else
zeus test spec
fi
else
echo "Zeus is not running"
if [ "$#" -gt 0 ]; then
rspec "$@"
else
rspec spec
fi
fi
}
tt () zeus rspec --tag $1 spec
r () {
if zeus_on; then
zeus rake "$@"
else
echo "Zeus is not running"
rake "$@"
fi
}
c () {
if zeus_on; then
zeus c "$@"
else
echo "Zeus is not running"
rails c "$@"
fi
}
jt () {
if zeus_on; then
if [ "$#" -gt 0 ]; then
zeus tr spec:javascript SPEC="$@"
else
zeus tr spec:javascript
fi
else
echo "Zeus is not running"
if [ "$#" -gt 0 ]; then
rake spec:javascript RAILS_ENV=test SPEC="$@"
else
rake spec:javascript RAILS_ENV=test
fi
fi
}
# ##############################
# ############ GIT #############
# ##############################
gcurrent () git rev-parse --abbrev-ref HEAD
gclean! () git clean -f -d
gd () git diff "$@"
gds () git diff --staged "$@"
gdh () git diff HEAD^
gr () git rebase "$@"
gri () gr -i "$@"
grc () gr --continue
gback () git reset HEAD^
gh () hub browse
gac () {
ga
gc "$@"
}
gacm () gac -m "$@"
ga () {
if [ "$#" -gt 0 ]; then
git add "$@"
else
git add .
fi
}
gp () git pull "$@"
gs () git status "$@"
gsp () git stash pop
gss () git stash save
gl () git log --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit "$@"
gco () git checkout "$@"
gcom () git checkout master
gpush () git push "$@"
gb () git branch "$@"
gbd () git branch -d "$@"
gc () git commit "$@"
gca () gc --amend
grb () git rebase "$@"
g () git "$@"
gcpick () git cherry-pick "$@"
grh () git reset --hard "$@"
gbdelete () git push origin --delete "$@"
# ###############################
# ######## CD SHORTCUTS #########
# ###############################
fish_dir () cd ~/.config/fish/
# Define code_directory in .zshrc
code () cd /$code_directory/"$@"
f () code "$@"
# ##############################
# ########### OTHER ############
# ##############################
tasks () ps aux | grep $@
b () bundle $@
ll () ls -lh $@
fs () foreman start $@
hcon () heroku run rails console
dtest () tail -f diagnostic.txt
sb () {
if [ "$#" -gt 0 ]; then
sublime "$@"
else
sublime .
fi
}
fish_edit () {
sb ~/.config/fish/config.fish
}
可能与此无关,但对我也很困惑。当我在相关文件中打开一个新的shell tab时,会收到有关使用
grep
的警告。以前Fish没有出现过这种情况:
usage: grep [-abcDEFGHhIiJLlmnOoqRSsUVvwxZ] [-A num] [-B num] [-C[num]]
[-e pattern] [-f file] [--binary-files=value] [--color=when]
[--context[=num]] [--directories=action] [--label] [--line-buffered]
[--null] [pattern] [file ...]
最后,需要导入这些插件的.zshrc
文件。 这个答案(尽管行为不同)表明可能是PATH
定义问题,但我认为我在我的PATH
中包含了所有必要的路径:
# Path to your oh-my-zsh installation.
export ZSH=$HOME/.oh-my-zsh
export code_directory=$HOME/code/
ZSH_THEME="robbyrussell"
plugins=(functions github)
# User configuration
export PATH="/Users/sasha/.rvm/gems/ruby-2.2.0/bin:/Users/sasha/.rvm/gems/ruby-2.2.0@global/bin:/Users/sasha/.rvm/rubies/ruby-2.2.0/bin:/Users/sasha/.rvm/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/git/bin"
# export MANPATH="/usr/local/man:$MANPATH"
source $ZSH/oh-my-zsh.sh
回答以下问题:
➜ .oh-my-zsh git:(master) ✗ which ls
ls: aliased to ls -G
➜ .oh-my-zsh git:(master) ✗ typeset -f ls
ls () {
ls -G -lh $@
}
➜ .oh-my-zsh git:(master) ✗ type ls
ls is an alias for ls -G
更新
我已经找出了导致这个问题的原因,但不知道为什么会出现这个问题。问题出在这一行代码:
ll () ls -lh $@
在我的函数文件中,我想当我键入ll
时运行ls -lh whatever-arguments-follow
。为什么当我运行ls
时会出现错误?
which ls
或typeset -f ls
或type ls
会输出什么? - Jensls -G
会破坏终端标签。 - Sashals
的递归(无限)定义引起的吗?如果将ls
别名为/bin/ls -G
会发生什么? - bdesham