bash vs csh vs others - 哪个更适合应用程序维护?

时间:2010-11-30 18:42:10

标签: linux bash zsh csh tcsh

  

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

我开始熟练掌握Linux环境,并且我试图在命令shell脚本方面选择一种武器(因为我仍然是一个很大的n00b),这将有助于我(和其他人)管理,测试和管理在* NIX环境中运行的一组服务器端应用程序。

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

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

  2. 是否有大量的开发人员知道这个shell脚本?

  3. 它是否安全且易于使用 - 脚本错误是无声的还是提供智能错误输出,是否会让那些不知情的人在脚下自我射击?

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

  5. 标准如何?它是否应该被包含在* NIX的大多数发行版中,还是必须另外安装?

  6. 我知道有些营地对特定指挥炮弹持强烈的感情,我只是在寻找知情的意见。

5 个答案:

答案 0 :(得分:23)

现在,几乎所有非嵌入式(或大型嵌入式)操作系统都具有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。 Pro:您不必担心不同的变体,因为有一个标准的,兼容的实现很容易获得。 Con:你没有受益于bash和ksh的扩展。
  • 使用ksh和bash的交集。这在外观上很有吸引力,但它确实意味着你必须使用两个参考文档而不是一个 - 甚至bash和ksh共有的功能并不总是使用相同的语法。找出你想在给定系统上使用哪一个也很痛苦。
  • 选择ksh或bash之一。 bash和ksh都可以在所有类似unix的平台和Windows上使用。两者都有一个开源实现(唯一一个用于bash,ATT ksh93用于ksh),可以安装在大多数平台上。因为两个原因,我会选择bsh over ksh。首先,它是Linux上的默认设置,因此您会找到更多习惯它的人。其次,有一些系统带有较旧的,功能较少的ksh实现;即使您可以安装ksh93,在部署时也需要考虑另一件事。

忘掉脚本的csh,如果你想要普通的默认可用性,请忘记zsh。

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

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

答案 1 :(得分:16)

csh几乎总是wrong

答案 2 :(得分:6)

Z shell(zsh)

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

  1. 无论你学习哪种shell,它们的语法都非常相似。只有内置命令可能略有不同。但是不要选择那些旧的和不受维护的。
  2. Bash是最受欢迎的。但是bash中的几乎所有命令都以相同的方式在zsh中工作。当然也有一些例外。
  3. AFAIK,每个shell都以同样的方式处理它。但要注意 - shell是愚蠢的,它们不像编程语言那么聪明。
  4. 我看到zsh正在处理所有Linux,FreeBSD和OpenSolaris。
  5. 请参阅4.发行版在他们的回购中有zsh。
  6. 为什么我更喜欢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"。你可能不想要波兰语的语言环境。

答案 3 :(得分:3)

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

有一种观点认为使用最“流行”的外壳最适合可维护性,出于同样的原因,Windows最好(我不是说它是):很容易找到你可以雇佣的人知道如何使用它。比起ksh或zsh,只有更多的人至少熟悉bash特有的功能。找到真正理解他们正在做什么的人是另一回事。

所有炮弹都有各种各样的陷阱,角落和奇怪的行为。主要取决于你习惯的东西。踢我自己的脚是我称之为Unix的传统,没有* nix shell可以真正保证你的安全。

您将看到的几乎每个外壳都可以在几乎所有平台上轻松移植。即使这是真的,你也不一定能在三个不同的盒子上运行相同的(比方说)bash脚本,除非你小心使用了哪些实用工具以及你传递了哪些选项。编写可移植的shell脚本很难理由与它们编写的shell无关。

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

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

答案 4 :(得分:1)

bash是标准,非常擅长交互式使用(良好的完成支持许多程序,历史,readline支持,多种字符串扩展)。对于shell(数组和散列,引用,字符串操作),它也擅长脚本编写;虽然编写可靠的脚本需要你学到更多东西。

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

  1. 感谢互动,大多数贝壳只有在您开始使用它们时才能轻松学习
  2. 我相信bash和posix子集的知名度更高。但是我提到的语言就像许多贝壳一样众所周知。
  3. 你可以轻松地在脚下射击,方便往往使不受欢迎的事情变得容易。
  4. 和5.外壳本身的便携性应该不是问题;您可能需要重新编译才能在您提到的某些操作系统上获得更多现代功能。使用完整的语言和自己的库将有助于平滑多种平台的变化。