17

可能重复:
我应该使用什么 Linux shell?

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

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

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

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

  3. 它是否安全且易于使用 - 脚本错误是否会保持沉默或提供智能错误输出,它会让外行人自己在脚下开枪吗?

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

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

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

4

5 回答 5

26

如今,几乎所有非嵌入式(或大型嵌入式)操作系统都有POSIX:2001 aka 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 如果你想要通用的默认可用性。

另请参阅主流 *NIX shell 之间的根本区别是什么?,尤其是我的答案中的“用于脚本”部分。

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

于 2010-11-30T20:32:53.913 回答
16

csh 几乎总是错误的。

于 2010-11-30T19:04:36.967 回答
7

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],它建议dnddomainname. java想要类名作为第一个参数,zsh 将建议包和所有子包中可用的所有类。

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

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

于 2010-11-30T18:55:15.697 回答
3

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

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

所有的 shell 都有各种陷阱、极端情况和奇怪的行为。大多数情况下,它归结为你习惯的东西。在脚上射击自己是我称之为伟大的 Unix 传统,没有 *nix shell 可以真正保证你的安全。

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

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

就我个人而言,我使用 bash 是出于(大部分)惯性。如果我对它还不是很熟悉,我会使用 zsh 来代替。

于 2010-11-30T19:00:37.430 回答
1

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

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

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