bash vs csh vs其他 – 哪个更适合应用程序维护?

可能重复:
我应该使用哪个Linux shell?

我开始熟练掌握Linux环境,并且正在尝试从命令行脚本中select一个select武器(因为我仍然是一个很大的n00b),这将帮助我(和其他人)pipe理,testing并pipe理在* NIX环境中运行的一组服务器端应用程序。

我的问题是:当考虑到以下标准时,什么是优先级命令shell?

  1. 学习/理解一个从未接触过shell脚本的初级开发者有多容易?

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

  3. 是安全和易于使用 – 脚本错误将保持沉默或提供智能的错误输出,它会让不经意的射击自己的脚?

  4. 它是多么便携? – 我可以期待在OpenSolaris以及Redhat,FreeBSD上运行相同的脚本吗? (授予特定操作系统的命令语法和选项将相应地改变)

  5. 标准如何? 预计它将被包含在* NIX的大部分发行版中还是必须另外安装?

我知道那里有一些阵营,他们对特定的命令壳抱有强烈的感情,我只是在寻找知情的意见。

Solutions Collecting From Web of "bash vs csh vs其他 – 哪个更适合应用程序维护?"

现在,几乎任何非嵌入式(或大型嵌入式)操作系统都具有POSIX:2001(又名单一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。 临:你不必担心不同的变体,因为有一个标准和兼容的实现是随时可用的。 Con:你不会受益于bash和ksh的扩展。
  • 使用ksh和bash交集。 这在外观上很有吸引力,但是这意味着你必须使用两个参考文档,而不是仅仅使用一个 – 甚至bash和ksh的共同特性并不总是使用相同的语法。 搞清楚在给定的系统上使用哪一个也是一种痛苦。
  • 选择ksh或bash之一。 bash和ksh都可以在所有类Unix平台和Windows上使用。 两者都有一个开放源码的实现(唯一的一个bash,ATK ksh93 ksh),可以在大多数平台上安装。 我会因为两个原因而对bash超过ksh。 首先,这是Linux上的默认设置,所以你会发现更多的人习惯了它。 其次,系统中有一个较老的,功能较少的ksh实现; 即使您可以安装ksh93,在部署时还需要考虑另一个问题。

忘记csh脚本,忘记zsh如果你想共同的默认可用性。

另请参见主流* NIX shell之间的根本区别是什么? 特别是我的答案的“脚本”部分。

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

csh几乎总是错的 。

Z shell(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 ... for file in ./**/*.java; do ... (我的意思是./**/*.ext
  • 要我确认什么时候我做rm * 🙂
  • tab-autocompletion是好多了,我可以写dmdomi[tab] ,它建议dnddomainnamejava想要类名作为第一个参数,zsh会提示包中的所有类和所有子包。

但是你并不仅限于zsh。 如果有什么不适合你的话,你可以用bash或sh来写。 这就是脚本顶部的"#!/bin/bash" 。 🙂

要快速启动,使用我的.zshrc配置: http : export LANG="pl_PL.UTF-8"你应该改变的唯一的是export LANG="pl_PL.UTF-8" 。 你可能不希望波兰的区域设置。

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

有一个理由要说,使用最流行的外壳最好是可维护性,因为Windows是最好的(我不是这么说的):很容易找到你可以雇用谁知道如何使用它。 比起ksh或者zsh,只有更多的人对bash特有的功能至少有一个熟悉的感觉。 找到真正了解他们在做什么的人是另一回事。

所有的炮弹都有各种各样的陷阱,角落案例和奇怪的行为。 主要归结于你习惯的。 在脚下自我拍摄是我所说的宏伟的Unix传统,没有任何* nix shell能真正保证你的安全。

几乎每个你会看到的外壳几乎可以在任何平台上移植。 即使这是真的,你不一定能够在三个不同的盒子上运行相同的(比如说)bash脚本,除非你小心使用了哪些工具以及你通过了哪些选项。 编写可移植的shell脚本是很难的,因为与它们写的shell无关。

几乎每个Linux默认都使用bash,而且大多数shell都可用。 FreeBSD在默认情况下包括sh,csh和tcsh,而bash和其他的则是在ports中。 很久以前,Mac OS X默认使用tcsh,但默认情况下它使用bash,包括zsh以及最常见的shell。 除此之外,我无法评论。

我个人使用(主要是)惰性bash。 如果我不熟悉它,我会用zsh代替。

bash是标准,很好的交互使用(很好的完成支持很多程序,历史,readline支持,多种字符串扩展)。 对于一个shell(数组和散列,引用,字符串操作)也是很好的脚本。 尽管编写可靠的脚本需要您学习更多。

如果你想让你的程序能够增长,使用精细的数据结构,并使用一些有用的库,你应该学习像python,ruby或perl这样的语言。 这些人大部分都有交互式口译员,不像外壳那么方便,但是对于快速测试是有用的。 对于Python而言,IPython特别有用; 它让你很容易探索文档,可以加载和重载源代码,包括一个调试器。 它还包含一些标准的shell命令,可以通过在标准shell中添加一个!

  1. 由于互动,大部分的shell都很容易学习,一旦你开始独占使用它们
  2. 我相信bash和posix的子集,更广为人知。 但是我提到的语言和许多炮弹一样众所周知。
  3. 你可以很容易地把自己打在脚下,方便常常使不受欢迎的事情变得容易。
  4. 5.壳本身的可移植性不应该是问题; 您可能需要重新编译才能在您提到的某些操作系统上获得更多的新功能。 使用一个全面的语言与自己的图书馆将有助于平滑你的多样性平台的变化。