终极 Shell——ZSH

Posted 追鑫少年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了终极 Shell——ZSH相关的知识,希望对你有一定的参考价值。

Shell是Linux/Unix的一个外壳,你理解成衣服也行。它负责外界与Linux内核的交互,接收用户或其他应用程序的命令,然后把这些命令转化成内核能理解的语言,传给内核,内核是真正干活的,干完之后再把结果返回用户或应用程序。

Linux/Unix提供了很多种Shell,为毛要这么多Shell?难道用来炒着吃么?那我问你,你同类型的衣服怎么有那么多件?花色,质地还不一样。写程序比买衣服复杂多了,而且程序员往往负责把复杂的事情搞简单,简单的事情搞复杂。牛程序员看到不爽的Shell,就会自己重新写一套,慢慢形成了一些标准,常用的Shell有这么几种,sh、bash、csh等,想知道你的系统有几种shell,可以通过以下命令查看:

cat /etc/shells

显示如下:

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh

在 Linux 里执行这个命令和 Mac 略有不同,你会发现 Mac 多了一个 zsh,也就是说 OS X 系统预装了个 zsh,这是个神马 Shell 呢?

目前常用的 Linux 系统和 OS X 系统的默认 Shell 都是 bash,但是真正强大的 Shell 是深藏不露的 zsh, 这货绝对是马车中的跑车,跑车中的飞行车,史称『终极 Shell』,但是由于配置过于复杂,所以初期无人问津,很多人跑过来看看 zsh 的配置指南,什么都不说转身就走了。直到有一天,国外有个穷极无聊的程序员开发出了一个能够让你快速上手的zsh项目,叫做「oh my zsh」,Github 网址是:github.com/robbyrussell。这玩意就像「X天叫你学会 C++」系列,可以让你神功速成,而且是真的。

好,下面我们看看如何安装、配置和使用 zsh。

安装zsh

如果你用 Mac,就可以直接看下一节
如果你用 Redhat Linux,执行:sudo yum install zsh
如果你用 Ubuntu Linux,执行:sudo apt-get install zsh
如果你用 Windows……去洗洗睡吧。

安装完成后设置当前用户使用 zsh:chsh -s /bin/zsh,根据提示输入当前用户的密码就可以了。

安装oh my zsh

首先安装 Git,安装方式同上,把 zsh 换成 git 即可。

安装「oh my zsh」可以自动安装也可以手动安装。

自动安装:

wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh

手动安装:

git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc

都不复杂,安装完成之后退出当前会话重新打开一个终端窗口,你就可以见到这个彩色的提示了:

技术分享

配置

zsh 的配置主要集中在用户当前目录的.zshrc里,用 vim 或你喜欢的其他编辑器打开.zshrc,在最下面会发现这么一行字:

# Customize to your needs…

可以在此处定义自己的环境变量和别名,当然,oh my zsh 在安装时已经自动读取当前的环境变量并进行了设置,你可以继续追加其他环境变量。

接下来进行别名的设置,我自己的部分配置如下:

  1. alias cls=‘clear‘  
  2. alias ll=‘ls -l‘  
  3. alias la=‘ls -a‘  
  4. alias vi=‘vim‘  
  5. alias javac="javac -J-Dfile.encoding=utf8"  
  6. alias grep="grep --color=auto"  
  7. alias -s html=mate   # 在命令行直接输入后缀为 html 的文件名,会在 TextMate 中打开  
  8. alias -s rb=mate     # 在命令行直接输入 ruby 文件,会在 TextMate 中打开  
  9. alias -s py=vi       # 在命令行直接输入 python 文件,会用 vim 中打开,以下类似  
  10. alias -s js=vi  
  11. alias -s c=vi  
  12. alias -s java=vi  
  13. alias -s txt=vi  
  14. alias -s gz=‘tar -xzvf‘  
  15. alias -s tgz=‘tar -xzvf‘  
  16. alias -s zip=‘unzip‘  
  17. alias -s bz2=‘tar -xjvf‘  
  18. #color{{{  
  19. autoload colors  
  20. colors  
  21.    
  22. for color in RED GREEN YELLOW BLUE MAGENTA CYAN WHITE; do  
  23. eval _$color=‘%{$terminfo[bold]$fg[${(L)color}]%}‘  
  24. eval $color=‘%{$fg[${(L)color}]%}‘  
  25. (( count = $count + 1 ))  
  26. done  
  27. FINISH="%{$terminfo[sgr0]%}"  
  28. #}}}  
  29.    
  30. #命令提示符  
  31. RPROMPT=$(echo "$RED%D %T$FINISH")  
  32. PROMPT=$(echo "$CYAN%[email protected]$YELLOW%M:$GREEN%/$_YELLOW>$FINISH ")  
  33.    
  34. #PROMPT=$(echo "$BLUE%M$GREEN%/  
  35. #$CYAN%[email protected]$BLUE%M:$GREEN%/$_YELLOW>>>$FINISH ")  
  36. #标题栏、任务栏样式{{{  
  37. case $TERM in (*xterm*|*rxvt*|(dt|k|E)term)  
  38. precmd () { print -Pn "\e]0;%[email protected]%M//%/\a" }  
  39. preexec () { print -Pn "\e]0;%[email protected]%M//%/\ $1\a" }  
  40. ;;  
  41. esac  
  42. #}}}  
  43.    
  44. #编辑器  
  45. export EDITOR=vim  
  46. #输入法  
  47. export XMODIFIERS="@im=ibus"  
  48. export QT_MODULE=ibus  
  49. export GTK_MODULE=ibus  
  50. #关于历史纪录的配置 {{{  
  51. #历史纪录条目数量  
  52. export HISTSIZE=10000  
  53. #注销后保存的历史纪录条目数量  
  54. export SAVEHIST=10000  
  55. #历史纪录文件  
  56. export HISTFILE=~/.zhistory  
  57. #以附加的方式写入历史纪录  
  58. setopt INC_APPEND_HISTORY  
  59. #如果连续输入的命令相同,历史纪录中只保留一个  
  60. setopt HIST_IGNORE_DUPS  
  61. #为历史纪录中的命令添加时间戳  
  62. setopt EXTENDED_HISTORY        
  63.    
  64. #启用 cd 命令的历史纪录,cd -[TAB]进入历史路径  
  65. setopt AUTO_PUSHD  
  66. #相同的历史路径只保留一个  
  67. setopt PUSHD_IGNORE_DUPS  
  68.    
  69. #在命令前添加空格,不将此命令添加到纪录文件中  
  70. #setopt HIST_IGNORE_SPACE  
  71. #}}}  
  72.    
  73. #每个目录使用独立的历史纪录{{{  
  74. cd() {  
  75. builtin cd "[email protected]"                             # do actual cd  
  76. fc -W                                       # write current history  file  
  77. local HISTDIR="$HOME/.zsh_history$PWD"      # use nested folders for history  
  78. if  [ ! -d "$HISTDIR" ] ; then          # create folder if needed  
  79. mkdir -p "$HISTDIR"  
  80. fi  
  81. export HISTFILE="$HISTDIR/zhistory"     # set new history file  
  82. touch $HISTFILE  
  83. local ohistsize=$HISTSIZE  
  84. HISTSIZE=0                              # Discard previous dir‘s history  
  85. HISTSIZE=$ohistsize                     # Prepare for new dir‘s history  
  86. fc -R                                       #read from current histfile  
  87. }  
  88. mkdir -p $HOME/.zsh_history$PWD  
  89. export HISTFILE="$HOME/.zsh_history$PWD/zhistory"  
  90.    
  91. function allhistory { cat $(find $HOME/.zsh_history -name zhistory) }  
  92. function convhistory {  
  93. sort $1 | uniq |  
  94. sed ‘s/^:[0?9]?:[0-9]*;.?/\1::::::\2/‘ |  
  95. awk -F"::::::" ‘{ $1=strftime("%Y-%m-%d %T",$1) "|"; print }‘  
  96. }  
  97. #使用 histall 命令查看全部历史纪录  
  98. function histall { convhistory =(allhistory) |  
  99. sed ‘/^.\{20\} *cd/i\\‘ }  
  100. #使用 hist 查看当前目录历史纪录  
  101. function hist { convhistory $HISTFILE }  
  102.    
  103. #全部历史纪录 top50  
  104. function top50 { allhistory | awk -F‘:[ 0-9]*:[0-9]*;‘ ‘{ $1="" ; print }‘ | sed ‘s/ /\n/g‘ | sed ‘/^$/d‘ | sort | uniq -c | sort -nr | head -n 50 }  
  105.    
  106. #}}}  
  107.    
  108. #杂项 {{{  
  109. #允许在交互模式中使用注释  例如:  
  110. #cmd #这是注释  
  111. setopt INTERACTIVE_COMMENTS        
  112.    
  113. #启用自动 cd,输入目录名回车进入目录  
  114. #稍微有点混乱,不如 cd 补全实用  
  115. setopt AUTO_CD  
  116.    
  117. #扩展路径  
  118. #/v/c/p/p => /var/cache/pacman/pkg  
  119. setopt complete_in_word  
  120.    
  121. #禁用 core dumps  
  122. limit coredumpsize 0  
  123.    
  124. #Emacs风格 键绑定  
  125. bindkey -e  
  126. #bindkey -v  
  127. #设置 [DEL]键 为向后删除  
  128. #bindkey "\e[3~" delete-char  
  129.    
  130. #以下字符视为单词的一部分  
  131. WORDCHARS=‘*?_-[]~=&;!#$%^(){}<>‘  
  132. #}}}  
  133.    
  134. #自动补全功能 {{{  
  135. setopt AUTO_LIST  
  136. setopt AUTO_MENU  
  137. #开启此选项,补全时会直接选中菜单项  
  138. #setopt MENU_COMPLETE  
  139.    
  140. autoload -U compinit  
  141. compinit  
  142.    
  143. #自动补全缓存  
  144. #zstyle ‘:completion::complete:*‘ use-cache on  
  145. #zstyle ‘:completion::complete:*‘ cache-path .zcache  
  146. #zstyle ‘:completion:*:cd:*‘ ignore-parents parent pwd  
  147.    
  148. #自动补全选项  
  149. zstyle ‘:completion:*‘ verbose yes  
  150. zstyle ‘:completion:*‘ menu select  
  151. zstyle ‘:completion:*:*:default‘ force-list always  
  152. zstyle ‘:completion:*‘ select-prompt ‘%SSelect:  lines: %L  matches: %M  [%p]‘  
  153.    
  154. zstyle ‘:completion:*:match:*‘ original only  
  155. zstyle ‘:completion::prefix-1:*‘ completer _complete  
  156. zstyle ‘:completion:predict:*‘ completer _complete  
  157. zstyle ‘:completion:incremental:*‘ completer _complete _correct  
  158. zstyle ‘:completion:*‘ completer _complete _prefix _correct _prefix _match _approximate  
  159.    
  160. #路径补全  
  161. zstyle ‘:completion:*‘ expand ‘yes‘  
  162. zstyle ‘:completion:*‘ squeeze-shlashes ‘yes‘  
  163. zstyle ‘:completion::complete:*‘ ‘\\‘  
  164.    
  165. #彩色补全菜单  
  166. eval $(dircolors -b)  
  167. export ZLSCOLORS="${LS_COLORS}"  
  168. zmodload zsh/complist  
  169. zstyle ‘:completion:*‘ list-colors ${(s.:.)LS_COLORS}  
  170. zstyle ‘:completion:*:*:kill:*:processes‘ list-colors ‘=(#b) #([0-9]#)*=0=01;31‘  
  171.    
  172. #修正大小写  
  173. zstyle ‘:completion:*‘ matcher-list ‘‘ ‘m:{a-zA-Z}={A-Za-z}‘  
  174. #错误校正  
  175. zstyle ‘:completion:*‘ completer _complete _match _approximate  
  176. zstyle ‘:completion:*:match:*‘ original only  
  177. zstyle ‘:completion:*:approximate:*‘ max-errors 1 numeric  
  178.    
  179. #kill 命令补全  
  180. compdef pkill=kill  
  181. compdef pkill=killall  
  182. zstyle ‘:completion:*:*:kill:*‘ menu yes select  
  183. zstyle ‘:completion:*:*:*:*:processes‘ force-list always  
  184. zstyle ‘:completion:*:processes‘ command ‘ps -au$USER‘  
  185.    
  186. #补全类型提示分组  
  187. zstyle ‘:completion:*:matches‘ group ‘yes‘  
  188. zstyle ‘:completion:*‘ group-name ‘‘  
  189. zstyle ‘:completion:*:options‘ description ‘yes‘  




以上是关于终极 Shell——ZSH的主要内容,如果未能解决你的问题,请参考以下文章

Linux终极shell-zsh的完美配置方案!——oh-my-zsh

终极 Shell——ZSH

开启终极效率shell之旅

终极之shell-zsh全解析

Zsh vs. Bash不完全对比解析,zsh是一种更强大的被成为“终极”的Shell

Mac 终端之终极Zsh命令篇

(c)2006-2024 SYSTEM All Rights Reserved IT常识