【问题标题】:bash vs csh vs others - which is better for application maintenance? [duplicate]bash vs csh vs 其他 - 哪个更适合应用程序维护? [复制]
【发布时间】:2011-05-18 01:32:48
【问题描述】:

可能重复:
What Linux shell should I use?

我开始精通 Linux 环境,并且我正在尝试选择一种可以帮助我(和其他人)的命令 shell 脚本(因为我仍然是一个大 n00b)的武器管理、测试和管理在 *NIX 环境中运行的一组服务器端应用程序。

我的问题是:当考虑以下标准时,首选的命令外壳是什么:

  1. 对于从未接触过 shell 脚本的初级开发人员来说,学习/理解有多容易?

  2. 那里有大量的开发人员知道这个 shell 脚本吗?

  3. 它是否安全且易于使用 - 脚本错误是否会保持沉默或提供智能错误输出,是否会让外行自取其辱?

  4. 它的便携性如何? - 我可以期望相同的脚本在 OpenSolaris 以及 Redhat、FreeBSD 中运行吗? (特定操作系统的授权命令语法和选项将相应更改)

  5. 标准如何?它会包含在 *NIX 的大多数发行版中还是必须额外安装?

我知道有些阵营对/反对特定的命令 shell 有强烈的感情,我只是在寻找一个明智的意见。

【问题讨论】:

  • stackoverflow.com/questions/199661/… - 我非常精通 bash,它通常包含在较新的东西中(如果你运行的是旧的东西,你可能只有 sh 和 csh),但我写了更多我的Perl/Python 中的脚本比什么都好。
  • 这几乎不是 199661 的复制品,后者专注于 Linux,而目前的问题需要可移植性。

标签: linux bash zsh csh tcsh


【解决方案1】:

Z 外壳 (zsh)

据说zsh是目前最强大的,所以我建议尝试一下。

  1. 无论您学习哪种 shell,它们的语法都非常相似。只有内置命令可能略有不同。但不要选择那些旧的和无人维护的。
  2. Bash 是最受欢迎的。但几乎 bash 中的每个命令都以相同的方式在 zsh 中工作。当然也有一些例外。
  3. AFAIK,每个外壳都以相同的方式处理它。但请注意 - shell 很愚蠢,它们不如编程语言聪明。
  4. 我看到 zsh 可以在所有 Linux、FreeBSD 和 OpenSolaris 上运行。
  5. 请参阅 4。发行版的存储库中包含 zsh。

为什么我更喜欢zsh (Z shell) 而不是bash

  • 文件匹配如下:for file in ./**/*.java; do ...(我的意思是./**/*.ext
  • 希望我确认rm * :)
  • tab-autocompletion 好多了,我可以写dmdomi[tab],它建议dnddomainnamejava 想要类名作为第一个参数,zsh 会建议包和所有子包中所有可用的类。

但您不仅限于 zsh。如果某些东西对你不起作用,你只需用 bash 或 sh 编写它。这就是脚本顶部的"#!/bin/bash"。 :-)

要快速开始,请使用我的 .zshrc 配置:http://www.rozne.geozone.pl/.zshrc 您唯一应该更改的是export LANG="pl_PL.UTF-8"。您可能不想要波兰语语言环境。

【讨论】:

  • @Sorpigal,在这里阅读有关 ksh 的信息:stackoverflow.com/questions/74844/bash-or-ksh
  • 我也会投票给 zsh,不过可以通过 Oh My Zsh 大大改进它。无需使用特定的.zshrc 或创建自己的,只需按照安装说明进行操作即可。 Oh My Zsh 会定期检查更新并从 shell 提示您是否有新版本可用。
  • @Nowaker 可能有点晚了,但是在 bash 中,如果您希望命令要求确认,当然可以添加 -i,当然如果您真的需要它,只需为此创建一个别名。附言-i 为所有主要命令添加交互性。
  • 如果你使用shopt -s globstar 启用它,Bash 支持./**/*.ext。这是在 Bash 版本 4 中引入的。
【解决方案2】:

任何*nix shell 的shell 脚本通常看似简单。容易的事情通常很容易,有时困难的事情很容易,有时看似容易的事情却很难。在这方面没有任何 shell 比其他 shell 更好,但有些更差(我不能认真推荐 csh)。有人会说 bash 是最糟糕的“现代”外壳,这可能是真的,但无论如何你都无法完全摆脱它。

有一个论点是,使用最“流行”的 shell 最适合可维护性,这与 Windows 是最好的原因相同(我并不是说它是):很容易找到可以雇用的人如何使用它。与 ksh 或 zsh 相比,至少有更多的人对 bash 特定的特性有一定的了解。找到真正了解自己在做什么的人是另一回事。

所有 shell 都有各种陷阱、极端情况和奇怪的行为。大多数情况下,它归结为你习惯的东西。在脚上开枪是我所说的 Unix 盛大传统,没有任何 *nix shell 可以真正保证您的安全。

您将看到的几乎每个 shell 都可以高度移植到几乎所有平台。即使这是真的,您也不一定能够在三个不同的盒子上运行相同的(比如说)bash 脚本,除非您注意您使用的实用程序以及您传递的选项。编写可移植的 shell 脚本很困难,因为与编写它们的 shell 无关。

几乎每个 Linux 都默认使用 bash,并且大多数 shell 都可用。 FreeBSD 默认包含 sh、csh 和 tcsh,端口中包含 bash 和其他。很久以前,Mac OS X 默认使用 tcsh,但现在它默认使用 bash,并且包括 zsh 以及最常见的 shell。除此之外,我无法发表评论。

我个人使用 bash 是出于(大部分)惯性。如果我还不太熟悉它,我会改用 zsh。

【讨论】:

    【解决方案3】:

    csh 几乎总是wrong

    【讨论】:

      【解决方案4】:

      bash 是标准的,非常擅长交互使用(很好的补全,支持很多程序,history,readline 支持,多种字符串扩展)。它还擅长编写脚本,用于 shell(数组和哈希、引用、字符串操作);虽然编写可靠的脚本需要您学习更多。

      如果您希望您的程序能够增长、使用复杂的数据结构并使用一些有用的库,您应该学习一门语言,如 python、ruby 或 perl。其中大多数也具有交互式解释器,虽然不如 shell 方便,但对于快速测试很有用。 IPython,对于 Python,特别有用;它使您可以非常轻松地浏览文档,可以加载和重新加载源代码,包括一个调试器。它还包括一些标准的 shell 命令,并且可以通过在它们前面加上 ! 前缀将其余命令传递给标准 shell。

      1. 由于具有交互性,一旦您开始专门使用它们,大多数 shell 都很容易学习
      2. 我相信 bash 和 posix 子集在很大程度上是众所周知的。但我提到的语言和许多 shell 一样广为人知。
      3. 您可以轻松地在脚下开枪,方便常常使不受欢迎的事情变得容易。
      4. 和 5. shell 本身的可移植性应该不是问题;您可能需要重新编译才能在您提到的某些操作系统上获得更多现代功能。使用具有自己的库的成熟语言将有助于平滑多种平台的变化。

      【讨论】:

      • pry for Ruby 很牛逼——拥有类似于 shell 的命令来让您探索对象。是的,你可以 cd 进入一个对象,然后 ls 它的所有内容、方法...
      【解决方案5】:

      如今,几乎所有非嵌入式(或大型嵌入式)操作系统都有POSIX:2001 a.k.a. Single Unix v3 兼容层。它在 unix 平台(Linux、Mac OS X、Solaris、*BSD 等)上是原生的,并且可以安装在 Windows 和 Android 等其他平台上。 POSIX 指定了一种shell 语言,通常称为POSIX sh。这种语言源自 Bourne shell。

      大多数 unix 系统都有 POSIX sh 的两种实现之一:ksh 或 bash,与 POSIX 相比,它们具有额外的有用特性。然而,一些不太主流的系统(尤其是嵌入式系统)可能只有 POSIX 强制要求的功能。

      鉴于您的目标,我看到了三个选择:

      • 限制自己使用 POSIX sh。优点:您不必担心不同的变体,因为有一个标准和兼容的实现是现成的。缺点:你不会从 bash 和 ksh 的扩展中受益。
      • 使用 ksh 和 bash 的交集。这在外观上很吸引人,但这确实意味着您必须使用两个参考文档而不仅仅是一个 - 甚至 bash 和 ksh 的共同特性也不总是使用相同的语法。弄清楚要在给定系统上使用哪一个也很痛苦。
      • 选择 ksh 或 bash 之一。 bash 和 ksh 在所有类 unix 平台和 Windows 上都可用。两者都有一个可以安装在大多数平台上的开源实现(bash 的唯一一个,ksh 的 ATT ksh93)。出于两个原因,我会选择 bash 而不是 ksh。首先,它是 Linux 上的默认设置,因此您会发现更多人习惯了它。其次,有些系统带有较旧的、功能较少的 ksh 实现;即使你可以安装 ksh93,这也是你在部署时必须考虑的另一件事。

      忘记使用 csh 编写脚本,如果您想要通用的默认可用性,请忘记 zsh。

      另请参阅What are the fundamental differences between the mainstream *NIX shells?,尤其是my answer 的“用于脚本”部分。

      请注意,shell 编程涉及到 shell 之外的其他实用程序。 POSIX 指定了那些其他实用程序。 “Bash 加上其他 POSIX 实用程序”是一个合理的选择,与“POSIX 实用程序(包括 sh)”不同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-10
        • 2013-04-13
        • 2013-02-24
        • 2019-02-05
        • 2011-05-02
        • 1970-01-01
        • 2011-08-18
        • 2010-09-21
        相关资源
        最近更新 更多