【问题标题】:What Linux shell should I use? [closed]我应该使用什么 Linux shell? [关闭]
【发布时间】:2010-09-17 00:17:59
【问题描述】:

我使用过 bash、csh 和 tcsh。但我问了this question,乔纳森告诉我 csh 不值得信任。那么什么样的 Linux shell 对开发有好处。为什么?

【问题讨论】:

  • 好的 - 你的电话。但是...您决定使用哪个外壳?我认为这应该表明您接受的答案;所有人都会理解,该决定中存在主观因素,因为 shell 就像编辑器——不同的人喜欢不同的人。
  • 如果有人问这个问题后想知道我选择了什么 shell,我改用 bash,但主要是因为我换了公司。有时我在处理我在旧公司的程序,我不得不切换回 csh 或 tcsh,因为这是他们设置使用的,并且不值得重写环境的成本。

标签: linux shell


【解决方案1】:

到目前为止,Linux 上最常见的 shell 是 bash。除非您有充分的理由使用替代方案,否则我建议您坚持使用 bash,或者您的项目团队最常用的 shell(或者您必须使用的大部分 shell 脚本)使用。

另一个非常常见的竞争者是 dash,它被 Ubuntu 项目越来越广泛地使用。

这真的是个人喜好,好吧,除了csh

Wikipedia link for csh

【讨论】:

【解决方案2】:

我更喜欢 zsh。

单是制表符完成就值得了:

  • 如果您愿意,它会扩展通配符(当您想删除目录中除一个文件之外的所有文件时很方便)
  • 指定程序后会给你一个开关列表
  • 在您正在处理的行下方提供选项卡补全选项,非常方便。

http://zsh.sourceforge.net/

【讨论】:

  • 请原谅我的无知,但它如何列出可执行文件的开关?这是否仅适用于常用程序,例如 ls、ps、.. 或任何给定程序?
  • 我想它会解析手册页?不能肯定地说,虽然我不使用 zsh,但我可能会看一下这个背书。
  • 它可能会在后台运行 programname --help。
  • fizsh (Friendly Interactive ZSHell) 是否仍在积极开发/使用,fish 与 fizsh 相比如何?我看到 fizsh 在 Ubuntu 上可用。我正在考虑安装它。
  • 有点晚了,但是 zsh 有一组完成脚本,它会查询完成信息。许多常见应用程序的完成脚本包含在 zsh 中,一些应用程序提供自己的。
【解决方案3】:

为了交互性,使用 Zsh。有一段时间我是 Bash 选项卡完成脚本的 FreeBSD 端口的维护者,但在我第一次尝试 Zsh 时就放弃了它。它可以做 Bash 可以做的所有事情,但更轻松、更优雅。它还具有非常类似于 Bash 的击键的好特性,因此,如果您在没有 Zsh 的系统上,您将能够做到(即使它不会“感觉”那么好)。

对于脚本,请使用 Bourne Shell (sh)。它是 POSIX 标准脚本语言,您的脚本几乎可以在任何地方工作。 Bash 和 Zsh 以及其他 shell 具有不错的扩展,您会错过这些扩展,但它们会将您绑定到特定的设置。对于您确定永远不会在其他地方运行的仅供个人使用的脚本,请忽略该建议,但请记住,这是您需要考虑的真正权衡。

但总而言之,Zsh。我不知道任何尝试过的人没有立即永久切换。真的那么好。

【讨论】:

  • “有一段时间我是Bash tab-completion scripts的FreeBSD端口的维护者,但是我第一次尝试Zsh时就放弃了它。”也就是说,呃......告诉。我一直想花更多时间在 zsh 上,但我有足够的 Bash 自定义配置,我需要花一些时间重写它以符合 zsh。
  • "它可以做所有 Bash 可以做的事情" 请说明你是如何做到的(用实际的换行符替换 \n): bash -c 'shopt -s expand_aliases 2>/dev/null;alias eecho =echo;\neecho foo'
  • 这样做的目的是什么?
【解决方案4】:

Fish(友好的交互式外壳)是大多数其他外壳的不错替代品。它具有一致的语法、良好的制表符补全和语法突出显示,易于上手和使用(尤其是如果您没有使用其他 shell 的习惯),并且具有出色的运行时帮助。

缺点是它的开发不规律,用户群很小(但很有帮助),并且与其他 shell 非常不同。与 shell 习惯用法的向后兼容性不是优先事项。

在很多情况下这很好...很多标准的 shell 有非常愚蠢的做事方式,只是因为它一直都是这样做的。 “做/完成”、“案例/esac”、“如果/fi”?这是鱼会消除的精神错乱。

值得一看。

【讨论】:

  • 有很多小改动可以让你更高效地使用它。永久的后台自动完成功能非常棒,例如,当您甚至不记得曾经输入过它们时,它会为您提供先前的命令。
【解决方案5】:

既然我相信我是建议你应该使用 C Shell 以外的东西的人,也许我应该稍微修饰一下我的言论,然后支持那些说“Linux 上的 bash,其他平台上的 Korn shell”的人(除非bash 也安装在那里)'。

比较像编辑器(你更喜欢vim 还是emacs),shell 的选择部分是熟悉度问题,部分是偏好问题。有很多人喜欢 C shell,尽管我确实相信它不如 Bourne shell 和衍生工具那么容易编程。我在 .cshrc 中的内容确实等同于 exec /bin/ksh(这并不完全相同,因为我想执行一个登录 shell - 一个读取配置文件的 shell 等等),但我不会谴责任何人如果是明智的决定,则使用 C shell 或衍生工具。

如果你决定要使用 C shell 以外的东西,那么你基本上属于 Bourne shell 阵营,POSIX 标准或多或少地指定了预期的行为,然后是不同的 shell——也就是说, Bourne、Korn 或 Born Again shell——添加(或者,在经典的 Bourne shell 的情况下,减去)一些功能。如果您的代码可能需要从 Linux 迁移到 HP-UX、Solaris 或 AIX(经典的 AT&T 派生的 Unix 变体中幸存的三重奏),那么您应该考虑确保使用经典的 Bourne shell 编写 shell 脚本,尽管 Korn shell 也很安全。但请注意,在 Linux 上您可以编写 #!/bin/sh 并获得 Bash,在其他平台上,您将获得 Bourne shell。

我在 Korn shell 和 Bash 之间切换没有大问题 - 很少有小问题。我倾向于避开这两种语言中没有明确定义的那些角落——这往往意味着“在两者中都有定义”。对于那些使用 Linux 的人来说,另一个问题是 GNU 工具比经典的 Unix 版本有更多的选项,并且您可能会失去可移植性,这不是因为您使用的 shell 编程结构,而是因为您使用的命令选项。经验丰富并随时可以访问其他系统的手册页会大有帮助。

【讨论】:

    【解决方案6】:

    我通常坚持使用 bash,因为它比直接 sh 更友好,而且它是我半定期使用的每个发行版(SuSE、RHEL、Ubuntu、Slackware)的默认设置。

    但是,如果您打算编写可移植的 shell 脚本,请确保它们都在 real sh 中运行。

    【讨论】:

    • 真正的sh是什么意思?有很多 shell,包括 bash,声称使用扩展来实现 posix sh,并且在所有这些 shell 中运行都尽可能好。但是,即使您坚持使用 posix sh,您是否还在使用任何其他不标准的程序?
    • "Real sh" 就是这个意思——真正的 Bourne Shell,例如 FreeBSD 机器上的 /bin/sh。 Ubuntu 在从使用 bash 切换到 dash 作为 /bin/sh 时遇到了各种各样的问题,因为脚本编写者在不知不觉中包含了在更兼容的实现上失败的 bashism。
    • 真正的 Bourne Shell 不兼容 posix,因此不应在任何现代 unix 上安装为 /bin/sh。
    【解决方案7】:

    重击。这是标准的。

    【讨论】:

      【解决方案8】:

      here 所解释的,csh 的问题在于它对脚本编写很垃圾。没有真正的理由不应该将它用作交互式 shell,但是大多数人发现学习两个不同的 shell 并且不能在命令行上尝试他们的脚本部分会让人感到困惑,所以使用它是最简单的一切都一样。

      交互式 shell 的明显候选者是 bash、dash、zsh 和 {pd,}ksh。所有这些都实现了 posix shell 标准,并带有一些小的扩展。选择你喜欢的交互式使用,我倾向于使用 bash,因为它是 linux 上的标准,但它们都有其优点,特别是 zsh 似乎很受欢迎。

      如果您要编写一个可移植的脚本,请使用 #!/bin/sh,并确保使用标准 posix shell 语法。如果它适用于 bash 和 ksh,它可能是标准的。有一些旧版本的 unix 有一个非标准的 /bin/sh 但除非你知道你必须这样做,否则我不会为此烦恼。更多的可移植性问题是您从脚本中调用的所有命令行工具。

      【讨论】:

      • “csh 被认为是有害文档”值得一读,但我认为人们还应该阅读grymoire.com/Unix/CshTop10.txt 上的“不使用 C shell 的十大理由”,这可以更好地说明使用 csh 或 tcsh 编写脚本的问题。我还要添加 csh 的另一个缺陷:没有 shell 函数,因此 csh 脚本是所有相互采购的小脚本的意大利面条。这么多以 C 为模型!无论如何,除了我使用 bash 的小型一次性脚本之外,我更喜欢用 Python 编写脚本。
      【解决方案9】:

      没有人提到 sh 的基于 Debian 的标准,它是 Debian Almquist shell dash。它完全符合 POSIX 标准并且启动速度非常快,这就是 Debian/Ubuntu 将它用于/bin/sh 的原因。

      所以我将bash 用于我的交互式shell,但仅dash 用于脚本。这样我就知道我的脚本至少符合 POSIX,并且可以在任何其他 POSIX shell 上运行。 ...我知道可移植性不仅仅是外壳,而是我划清界限的地方。

      【讨论】:

        【解决方案10】:

        我不是 Ruby 大用户,但 http://rush.heroku.com/ 看起来很有趣

        【讨论】:

          【解决方案11】:

          坚持使用 bash 可能是最好的,因为它是最广泛使用的 shell,并且您可能从某人那里获得的任何教程或帮助很可能会使用 bash。但是,我已经开始在我的所有脚本中使用 zsh,并且我发现它在脚本方面远远优于 bash。

          【讨论】:

            【解决方案12】:

            不要使用 Korn Shell (ksh)。

            除非你打字很完美,而且永远不需要使用退格键。

            【讨论】:

            • 为什么?在 Korn shell 中使用退格键我从来没有遇到过任何问题。
            • 确实如此,但前提是您的系统设置错误。如果您的终端为退格生成 DEL (0x7f),但您将 stty erase 设置为 ^H,则 ksh 将无法正确退格。 bash 无论如何都会因为它总是将 DEL 识别为退格,无论 stty 擦除设置为。
            • 好吧……这有点道理。我从来没有注意到这个问题,但可能是因为我很少使用会生成 DEL 的键盘。
            • 在真正的 ksh 中,键入反斜杠后跟一个退格键会在命令行中同时嵌入反斜杠和退格键。我认为 pdksh 消除了这种特殊的精神错乱。
            【解决方案13】:

            其实我喜欢 ksh。它比 bash 更一致,因为它不尝试支持任何 csh 构造。根据我的经验,tcsh 与其他 shell 的兼容性最低,我避免使用它。我尝试为 sh 编写脚本,但 ksh 确实具有一些不错的功能,例如在一行上导出和设置变量。我也尝试保持与 bash 的兼容性,因为它功能齐全且很常见。要编写可移植的 shell 脚本,这比选择“最好”的 shell 更重要,你可以参考这本书。

            便携式 Shell 编程:Bruce Blinn 的 Bourne Shell 示例的广泛集合(HP 专业系列)(平装本 - 1995 年 10 月 29 日) amazon.com

            【讨论】:

              【解决方案14】:

              我一直在使用 pdksh,没有任何接近完美的打字(也许您需要修复您的 termcap?)。

              ksh 是标准,csh 是标准,bash 是“标准”,但仅限于 linux。最好以 ksh 为目标。

              【讨论】:

                【解决方案15】:

                对于编写实际脚本,我更喜欢ksh,它有几个对编程有用的扩展并修复了one of my pet annoyances

                bash 是我对交互式会话的偏好,但这更多的是个人偏好问题。只要确定它是一个 Bourne 类型的 shell。

                【讨论】:

                  【解决方案16】:

                  我也是从 csh、tcsh 到 bash。它有所不同,但经过一段时间后,至少和 c-shell 一样好。

                  对于脚本,我建议使用 ksh,因为它在大多数 Unix 上都可用(Solaris、HP-UX、OSF/1(有史以来最好的 UNIX ;)——现在是时候了))并且它具有很好的特性。使用 Korn,您可以对大多数脚本进行编程。偶尔你想得到比一个数字更多的值,作为函数的返回值,或者你有一些你不能放在一个简单数组中的数据,或者你需要一些在正则表达式的情况下具有更好功能的东西,或者其他什么,那么我会建议perl。

                  【讨论】:

                    【解决方案17】:

                    对于脚本,请尝试使用 dash 一段时间以更好地了解可移植性。如果你曾经使用 bash 编写过 shell 脚本,请在脚本 shebang 中显式声明 bash。

                    为了您的个人控制台使用,请尝试现有的内容。找到你觉得舒服的东西。选择一个必须从源代码编译的 shell,用于您关心使用它的每台机器,让您的所有系统管理员朋友变得古怪并惹恼您。

                    【讨论】:

                    • 哈哈。我不想与系统管理员为敌。在我工作的小型开发商店中,我是自己的系统管理员。
                    【解决方案18】:

                    我认为 FISH 是最好的,它有语法高亮(对于不存在的命令)并且可以自动填充。而且很容易学。

                    【讨论】:

                      【解决方案19】:

                      选择一项: 一种。 tcsh 湾。克什 C。 zsh d。登录 e.重击

                      我会使用登录。只是在说。

                      【讨论】:

                      • 你了解什么是登录shell吗?它无法与 tcsh、ksh、zsh、bash 等相比,因为它只是在您的用户 ID 登录交互式会话时运行的 shell。
                      猜你喜欢
                      • 2011-11-11
                      • 1970-01-01
                      • 2012-12-23
                      • 2021-07-13
                      • 2010-11-27
                      • 1970-01-01
                      • 2023-03-19
                      • 1970-01-01
                      • 2022-11-02
                      相关资源
                      最近更新 更多