LinuxTOY 是一个致力于提供 Linux 相关资讯的专题站点。如果您发现了好用好玩的 Linux 东东并愿意发扬自由、分享的精神,可以点击顶部导航 Contact 按钮进行投稿。

Related entries

  • No related posts

终极Shell——Zsh

[撰文/Kardinal]

子曾经曰过,zsh: The last shell you’ll ever need!
Z是最后一个字母,所以它是终极Shell。

我曾经搜索到一个比较各种Shell的文章,Zsh交互性是A+级别的,远高于其它Shell。在编程方面,Zsh是A级的吧,也是最高的。只是不知道出于什么原因,Zsh被严重的低估了。

大多数的Linux用户比较偏爱Bash,因为大多数的发行版默认的就是它。平心而论,Bash确实比Csh之流的好用多了。不过Bash也有很多地方不尽人意,像自动补全的功能不够强大,定位较长路径不够方便等。

后来我使用Zsh。如果不调整一些必要的配置的话,Zsh甚至还不如Bash好用。这也是很多人尝试过并放弃过的原因。

Zsh配置文件试用 (内附讲解)

不熟悉Zsh的人,对Zsh最深刻的印象应该就是它的命令提示符了。它支持右侧对齐的提示符,并且可以配置成这个样子的:

zsh1-thumb.gif

不过我还是喜欢比较简单的样式。

Zsh的自动补全功能十分的强大,如图所示:

zsh2-thumb.gif

它可以自动补全命令、参数、文件名、进程、用户名、变量、权限符等。

Zsh还有一个贴心的功能:路径别名。假设有一个很长的路径,例如/home/lighttpd/html,可以把这个路径命名为 ~WWW。

zsh3-thumb.gif

Zsh可以使用Emacs风格的键绑定,习惯Bash键绑定的朋友无需重新适应。Zsh兼容大多数主流Shell,像Bash、Csh等。

错误校正

– directory — 是补全类型提示

/etc/x11 [tab] 后被修正为 /etc/X11

补全类型提示变成了 — corrections –
 
请注意,这个功能不是单纯的修正大小写,而是各种拼写错误
比如说上面的例子,如果输入的是11或者s11,它一样会修正为X11

有一个前提,就是每次修正,只允许有一处字符错误
两个以上的错误,除非可以匹配其它的选项,否则就不能修正
12 就不能修正为X11 ,除非候选里有 X12、Y12、Z12……

 
在配置文件里找到这一行,修改容错字数
        zstyle ‘:completion:*:approximate:*’ max-errors 1 numeric

当然可以把容错字数改大一些,不过太大了也没有意义了
随便输点什么,就可以匹配所有的,和没有一样

 
强大的重定向功能
同时重定向stdout和stderr到file: command |& >file
同时重定向到多个文件: command >file.1 >file.2

比如装系统的时候,可以用这个命令

 blkid >> /boot/grub/menu.lst >> /etc/fstab
 
补全类型控制
例如:
compctl -g ‘*.tar.gz *.gz*.tgz’ + -g ‘*(-/)’ tar zxvf
过滤候选项

tar zxvf [tab]
候选菜单中只出现扩展名为 .tar.gz .gz .tgz 的文件

不过这个功能比较复杂,容易引起混乱,通常需要脚本配合

代码:
compctl -g ‘*.tar.bz2 *.tar.gz *.bz2 *.gz *.jar *.rar *.tar *.tbz2 *.tgz *.zip *.Z’ + -g ‘*(-/)’ extractextract() {
   if [[ -z "$1" ]] ; then
       print -P “usage: \e[1;36mextract\e[1;0m < filename >"
       print -P "       Extract the file specified based on the extension"
   elif [[ -f $1 ]] ; then
       case ${(L)1} in
           *.tar.bz2)  tar -jxvf $1    ;;
           *.tar.gz)   tar -zxvf $1    ;;
           *.bz2)      bunzip2 $1       ;;
           *.gz)       gunzip $1       ;;
           *.jar)      unzip $1       ;;
           *.rar)      unrar x $1       ;;
           *.tar)      tar -xvf $1       ;;
           *.tbz2)     tar -jxvf $1    ;;
           *.tgz)      tar -zxvf $1    ;;
           *.zip)      unzip $1          ;;
           *.Z)        uncompress $1    ;;
           *)          echo “Unable to extract ‘$1′ :: Unknown extension”
       esac
   else
       echo “File (’$1′) does not exist!”
   fi
}

考虑到使用的不多,配置又麻烦,我没有配置这个功能
不过我想肯定有人愿意在这上面花点时间

 
 
将Zsh设置为默认Shell(不建议更改root用户的默认shell)
usermod -s /usr/local/bin/zsh

署名 • 注明出处 • 非商业性使用

33 Comments

  1. 1 aqueura Commented @ 2008-08-05 8:18 amReply to this comment

    我一直都用zsh,但是用的很肤浅,受教了。

  2. 2 cabrio Commented @ 2008-08-05 8:50 amReply to this comment

    我一直想用,但是不知道如何将我现在的用户从bash变成zsh,我只会在新建用户时指定shell

  3. 3 oomengnan Commented @ 2008-08-05 8:55 amReply to this comment

    貌似很复杂
    菜鸟我还是用bash比较顺手

  4. 4 tdsparrow Commented @ 2008-08-05 9:00 amReply to this comment

    toy用的什么terminal呀,urxvt?一直想要有这种多window的效果.

  5. 5 aqueura Commented @ 2008-08-05 9:07 amReply to this comment

    @cabrio chsh 可以做到。

  6. 6 walkerxk Commented @ 2008-08-05 9:12 amReply to this comment

    右侧对齐的提示符没有什么意思,
    bash可以补全命令、参数、文件名、用户名
    那个路径别名一直在bash下使用,输入~然后按tab。

  7. 7 anton Commented @ 2008-08-05 9:18 amReply to this comment

    1. chsh 可以更換 login shell.
    2. /etc/DIR_COLORS 可以不用存在啊~ 參考 dircolors 去 export LS_COLORS 就好了。
    3. 一個可以直接 dl 下來的 .zshrc 試用好像比較方便點。
    4. zsh “好像” 跟 screen 衝突… Orz 我再調整看看~ 因為我非要 screen 不可。

  8. 8 tdsparrow Commented @ 2008-08-05 9:18 amReply to this comment

    原来答案就在下一篇,呵呵。原来看见这种平铺式的布局出现在mrxvt的todo list中,一直很期待,甚至都想contribute一下,好像现在都还没有release。

  9. 9 Jason Lee Commented @ 2008-08-05 9:20 amReply to this comment

    修改/etc/passwd文件就可以修改默认的SHELL了.

  10. 10 雪梨 Commented @ 2008-08-05 9:24 amReply to this comment

    bash 的全能补全也是被低估了吧

  11. 11 cabrio Commented @ 2008-08-05 9:50 amReply to this comment

    @aqueura
    @anton
    谢谢,回去马上试试

  12. 12 kardinal Commented @ 2008-08-05 9:55 amReply to this comment

    to:10 雪梨

    BASH也可以补全变量啊用户啊什么的,但是要按特殊的组合键,看过王垠那篇火星文的都知道
    ZSH会自动根据上下文补全,所有可能出现的东西

    bash_completion我也不是没有用过(用的时间挺长的应该说)
    如果够好了,我为什么要用ZSH

    仔细看看关于Zsh的讨论部分,常见的质疑都有回答:D
    http://forum.ubuntu.org.cn/viewtopic.php?t=138936&postdays=0&postorder=asc&start=15

  13. 13 kardinal Commented @ 2008-08-05 10:36 amReply to this comment

    to:walkerxk
    右侧对齐的提示符本身并不实用,它只是提供了一种可能。例如能将提示符配置成第一幅图中的下面那种
    bash可以补全命令、参数、文件名、用户名,这个看过王垠那篇火星文的都知道,但是要按特殊的组合键
    bash的路径别名还真不知道,以前用bash的时候搜遍大江南北也没找到这个功能:D

    to:anton
    配置文件整理后上传
    Ubuntu论坛上的roylez兄同时使用zsh和screen,他提供了一个解决方案
    http://forum.ubuntu.org.cn/viewtopic.php?t=138936&postdays=0&postorder=asc&start=15

  14. 14 anton Commented @ 2008-08-05 11:05 amReply to this comment

    谢谢 kardinal ,啧啧啧,这连结里附的影片 screen 跟 zsh 搭的真漂亮。
    真想跟他要 screenrc 跟 .zshrc/.zprofile 来玩。

    roylez 真是行~

  15. 15 K Commented @ 2008-08-05 11:39 amReply to this comment

    zsh 能不能像 fish 一样实现彩色的命令行提示?

    之前想换掉 bash,一直也听说 zsh 比较强大,可是实在要花些时间研究,所以就用 fish 去了。总的来说还是不错,我自己也没什么很高深的应用需求,fish 基本都没能满足了。但是有几个实在无法忍受的 bug,比如非 X 环境一登录就卡死……

  16. 16 itroad8 Commented @ 2008-08-05 11:47 amReply to this comment

    不如来个比较bash,cshell,zshell的文章吧

  17. 17 Kardinal Commented @ 2008-08-05 12:04 pmReply to this comment

    to:k
    应该是可以的,不过配置可能比较麻烦。google一下说不定能找到答案
    其实颜色太多也不好,gentoo的emerge开始觉得挺不错,色彩比较丰富,就是有点晃眼……最近又用archlinux,觉得不用彩色显示更好,可以看自己想看的信息,而不是被强迫看作者认为重要并彩色标示出来的信息

    fish运行起来感觉还是比较迟钝的,而zsh的速度感觉比bash还要快,哪怕是比较大的配置文件:D

    to:itroad8
    有比较各种shell的文章,但每个人关注的侧重点不一样。大的方面比较,结论在文章的开头给出了:
    Zsh交互性是A+级别的,远高于其它Shell。在编程方面,Zsh是A级的吧,也是最高的。只是不知道出于什么原因,Zsh被严重的低估了。

  18. 18 Kardinal Commented @ 2008-08-05 12:07 pmReply to this comment

    to:anton
    本文介绍的功能,基本上是每个人都需要的功能。无论怎么配置zsh,这些功能都是不可少的
    至于其它功能,自己想办法吧:D

  19. 19 Jan Commented @ 2008-08-05 12:10 pmReply to this comment

    zsh的completion比bash的强大太多,bash+bash_completion我以前也用过很长时间

    那个花里胡哨的提示符看久了有点儿腻,而且如果是screen+zsh的用户有些信息(比如时间)会和screen的提示栏重复

  20. 20 K Commented @ 2008-08-05 12:46 pmReply to this comment

    Criteria Nb sh ksh bash zsh csh tcsh
    Configurability 1 - + ++ +++ + ++
    Execution of commands 2 + + + ++ + ++
    Completion 3 – + ++ +++ + ++
    Line editing 4 - + ++ ++ - ++
    Name substitution 5 + + ++ ++ + ++
    History 6 – + ++ ++ + ++
    Redirections and pipes 7 + + + ++ + +
    Spelling correction 8 – – – + – +
    Prompt settings 9 + + + ++ + ++
    Job control 10 – + + + + +
    Execution control 11 + + + + + +
    Signal Handling 12 + + + + - -

    来源:
    http://www.hep.phy.cam.ac.uk/lhcb/LHCbSoftTraining/documents/ShellChoice.pdf

  21. 21 希罗 Commented @ 2008-08-05 1:48 pmReply to this comment

    其实我是被zsh里更好的补全功能而吸引的!

  22. 22 AutumnCat Commented @ 2008-08-05 6:12 pmReply to this comment

    bash 用起来已经够舒服了,换来换去反而不习惯。

    to 4楼:很多东西都可以做到,但是其实不方便,因为窗变小了。

  23. 23 liufeng Commented @ 2008-08-05 8:49 pmReply to this comment

    其实我挺怀念高中时玩FreeBSD里面的csh的……

  24. 24 gsj987 Commented @ 2008-08-05 9:06 pmReply to this comment

    纠正错别字 引用框下第一行“凭心而论”应作“平心而论” :D

  25. 25 Toy Commented @ 2008-08-06 8:39 amReply to this comment

    @gsj987: 谢谢,已纠正。

  26. 26 fisher Commented @ 2008-08-06 9:43 amReply to this comment

    bash 也有基于 context 的上下文补齐啊: M-/

  27. 27 K Commented @ 2008-08-06 10:11 amReply to this comment

    请教一下,在 fish 里面,如果我输入“.pekwm”,再按向上箭头,fish 只会列出包含“.pekwm”的历史记录,比如“vim ~/.pekwm/mouse”,或“cd .pekwm”。在 zsh 里面要怎样配置才能实现这样的功能?

  28. 28 kardinal Commented @ 2008-08-06 10:48 amReply to this comment

    to:K
    这个似乎得用搜索了
    和bash差不多
    按Ctrl-r输入关键字搜索,再按Ctrl-r向前搜索,backspace向后搜索

  29. 29 daily post 08/06/2008 | 燃灯佛所 Pingbacked @ 2008-08-06 8:34 pmReply to this comment

    [...] 终极Shell——Zsh — LinuxTOY [...]

  30. 30 Rainux Commented @ 2008-08-08 2:35 pmReply to this comment

    确实比 bash 舒服多了,目录补全的时候可以循环枚举,而且循环时可以输入 / 进入当前目录开始循环枚举下一层目录。

    另外配置文件中要求 /etc/DIR_COLORS 存在,似乎是不必要的吧,直接 eval dircolors 的输出就可以了。

    [ -f /etc/DIR_COLORS ] && eval $(dircolors -b /etc/DIR_COLORS)
    改成
    eval $(dircolors -b)

  31. 31 f0g Commented @ 2008-08-18 5:17 pmReply to this comment

    最简单的能满足要求的就是最好的。

  32. 32 najja Commented @ 2008-08-30 7:01 pmReply to this comment

    弱问作者给的配置文件文件头和尾的一堆^@是什么?我都删掉鸟。。。其他很好用

  33. 33 Kardinal Commented @ 2008-11-23 9:27 amReply to this comment

    @Rainux:很好很强大^_^ 收录到《旅行手册》里了
    @najja:这里给出的配置文件不再维护,以《旅行手册》里的为准 ^_^