值得为日常使用切换到zsh吗?

193
在Mac OS X中,默认的shell是bash,我通常很高兴使用它。我很想让它自动完成更多的内容,但我听说zsh在这方面做得很好。但我不想花费数小时来调整设置以微小地提高我的命令行使用率,因为我的命令行生活并不那么糟糕。
(据我所知,bash也可以配置得更聪明一些。我对配置不是很感兴趣。)
即使只有少数情况下切换到zsh,是否会让我的生活更轻松?或者只有当你花时间学习为什么它更好时,它才是一个更好的shell?(也可以给出一些例子:)

@Rodney Amato和@Vulcan Eager分别给出坚持使用bash和切换到zsh的两个好理由。看来我必须调查这两者!好吧:)

有没有人对这个争论双方都有意见?


14
由于zsh(几乎)是bash的超集,因此您可以从迁移到zsh并像使用bash一样使用它开始。然后您可以一点一点地学习zsh的亮点。 - orip
如果你有一些bash自定义,并经常在emacs内部使用shell,这似乎并不容易。我发布了相关问题:http://stackoverflow.com/questions/13326879/any-tips-on-switching-from-bash-to-zsh-if-often-using-shell-inside-of-emacs - justingordon
我唯一不喜欢zsh的地方是(至少在Ubuntu上),第一次启动它时你必须自己配置它(而不是提供一些合理的默认值,以后可以调整)。如果你能克服这个问题,zsh是最好的! - zrajm
6个回答

87

我个人喜欢zsh。

一般来说,你可能不会注意到它和bash之间的区别,直到你需要快速完成像递归通配符这样的任务:

  • **/*.c 例如。

或使用后缀别名将特定的进程与不同的后缀关联起来,以便您可以直接“执行”它们。下面的别名允许您通过简单地键入 ./my_program.c 在提示符上“运行”C源文件 - 这将完全按照您键入 vim ./my_program.c 的方式工作。 (有点相当于双击文件图标。)

  • alias -s c=vim

或者打印今天修改的文件名称:

  • print *(e:age today now:)

你可能也可以在bash中完成所有这些事情,但是我的经验是,如果我想做某事,我可以在zsh-lovers中找到它。 我还发现书 '《从Bash到Z Shell》'非常有用。

玩弄令人难以置信数量的选项也很有趣!


1
这里的前两个例子对我来说没有任何意义(一个考虑切换到zsh的休闲bash用户) - 您能详细说明一下“递归通配符”是什么意思,或者您所说的“将特定程序与不同后缀关联”是什么意思吗? - aaronsnoswell
5
“递归式全局匹配”意味着搜索一个子目录及其所有子目录,以查找文件名与特定模式匹配的文件。Bash默认情况下不执行此操作;您需要使用“find”或“locate”进行递归搜索。但是,一旦您让另一个程序执行搜索,您会失去名称之间的边界(除非您小心),以及对shell内部全局匹配功能的访问权,基本上必须要么用其他程序提供的内容,要么将其输出传输到像“grep”、“awk”或“sed”这样的程序中(这些程序本身相当复杂)。 - cHao
6
现在,在bash中可以设置globstar选项以允许递归搜索,就像上面提到的那样。虽然我相当确定在写这篇答案时还没有这种情况。 - cHao
zsh中使用glob_star_short,现在可以执行**.c,它会被解释为**/*.c - PythonNut
我使用 zsh 5.3,并在执行 print *(e:age today now:) 时收到 command not found: age 的错误提示。 - Timo

70

对于非正式使用,您最好坚持使用 bash 并安装 bash completion。

安装它非常容易,从http://www.caliban.org/bash/index.shtml#completion下载 bash-completion-20060301.tar.gz 并使用以下命令进行提取:

tar -xzvf bash-completion-20060301.tar.gz

然后将bash_completion/bash_completion文件复制到/etc目录中

sudo cp bash_completion/bash_completion /etc

这将提示您输入密码。您可能需要为其他自动完成脚本创建/etc/bash_completion.d目录(例如,我在其中有git自动完成脚本)。

完成上述步骤后,最后一步是确保家目录中的.bash_profile文件具有:

if [ -f /etc/bash_completion ]; then
     . /etc/bash_completion 
fi

在登录时可以使用in it加载完成文件。

要测试它,只需打开一个新的终端,并尝试在cvs上补全,它应该会在补全列表中显示cvs选项。


我尝试了上述方法,但之后每次启动bash时都会出现4个“需要一元运算符”和4个“参数过多”的错误。 - AnnanFay
12
如果你正在使用OSX上的Homebrew,你可以运行brew install bash-completion - Nathan Villaescusa
3
Bash-Completion2 更好用!在 Mac OS X 上安装:brew tap homebrew/versions; brew install bash-completion2 - Zearin

38

切换到zsh。您将获得以下功能:

  1. zmv:您可以对数千个文件执行zmv '(*).mp3' '$1.wma'
  2. zcalc:非常舒适的计算器,比bc更好。
  3. zparseopts:一行代码即可解析传递给脚本的任意复杂选项。
  4. autopushd:在cd后始终可以执行popd以返回先前的目录。
  5. 浮点支持。有时需要。
  6. 哈希支持。有时它们只是一个关键特性。

18
zmv的示例应该是zmv '(*).mp3' '$1.wma'。请您进行更正,这样粗心的呈现可能会让初学者感到困惑和沮丧。 - qed
5
@TravisBear autoload zcalc; zcalc(虽然我自己只是在需要计算器时键入“python”)。 - Francisco
9
“autopushd: You can always do popd after cd to change back to your previous directory.” 的意思是“autopushd:在使用cd命令切换目录后,你可以随时使用popd命令返回到之前的目录。” 这个功能与使用cd - 命令的效果相同。 - minhaz1
5
“zmv”和“zcalc”不是预装的。不清楚“zmv”只是更改文件名,我原以为你可能在转换格式。我不知道“hashes”支持的含义是什么。这篇文章似乎只对已经了解Zsh的人“有用”。 - mpen
1
@Mark 在这种情况下,“hash”与“关联数组”是同义词。bash 4发布时间仅比此答案早几个月。 - chepner
显示剩余2条评论

13
如果您只想使用ZSH来获得更好的补全功能,那么配置非常简单。将以下内容放入您的~/.zshrc文件中即可:
autoload -U zutil      # [1]
autoload -U compinit   # [2]
autoload -U complist   # [3]
compinit

然而,值得一提的是,ZSH还有许多其他出色的功能。上面的示例将为您提供一个相当简单的提示符和良好的自动完成。如果您不想纠结于配置,但想了解ZSH能为您做什么,请搜索“zshrc”,您将获得一些可用的配置以开始使用。
[1]:http://zsh.sourceforge.net/Doc/Release/Zsh-Modules.html#The-zsh_002fzutil-Module [2]:http://zsh.sourceforge.net/Doc/Release/Completion-System.html#Initialization [3]:http://zsh.sourceforge.net/Doc/Release/Zsh-Modules.html#The-zsh_002fcomplist-Module

3
这会为哪些事情增加完整性?我不喜欢随意添加东西而不知道它的作用。 - mpen

6

zsh有一个控制台GUI配置工具。你可以很快、很容易地设置它,而不必费心去调整配置文件。我认为你不需要花太多时间来设置它,只需使用默认设置,可能只需要10秒钟,所以赶紧试一试吧。


10
你如何访问这个“控制台图形界面”? - mpen
通常情况下,当您加载没有任何相关点文件的 zsh 时,这是您看到的第一件事。要手动获取它,请尝试 autoload -U +X zsh-newuser-install; zsh-newuser-install -f - Adam Katz

3

Staale正在谈论一个向导式程序(CUI),第一次运行zsh时会自动运行。只需回答一些问题,查看/更改默认设置,即可为您配置。

IBM developerWorks有关于zsh的很好的资源。

我还没有使用过非常高级的功能,到目前为止,我还没有遇到应该妨碍从bash转换的严重差异。

一些例子:

  • !?pattern<Tab>将自动完成与模式匹配的历史记录中的最后一个命令。非常有用。

  • 您可以在RHS上配置提示符。其中一种用途是在左侧保持固定宽度的提示符,以便所有命令都能很好地对齐,同时显示pwd(或任何可变宽度的内容)作为右侧提示符。

  • 您可以从多个文件重定向输入(尚未尝试此操作):cat < file1 < file2 < file3


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接