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

Lou*_*ong 14 linux bash csh zsh tcsh

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

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

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

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

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

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

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

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

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

Gil*_*il' 23

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

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

另请参见主流*NIX shell之间的根本区别是什么?,特别是我的答案中的"for scripting"部分.

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


one*_*sse 16

csh几乎总是错的.


Now*_*ker 6

Z shell(zsh)

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

  1. 无论你学习哪种shell - 它们的语法都非常相似.只有内置命令可能略有不同.但是不要选择那些旧的和不受维护的.
  2. Bash是最受欢迎的.但是bash中的几乎所有命令都以相同的方式在zsh中工作.当然有一些例外.
  3. AFAIK,每个shell都以同样的方式处理它.但要注意 - shell是愚蠢的,它们不像编程语言那么聪明.
  4. 我看到zsh在所有Linux,FreeBSD和OpenSolaris上工作.
  5. 见4.发行版在他们的回购中有zsh.

为什么我更喜欢zsh(Z shell)攻击:

  • 像这样匹配的文件:( 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".您可能不想要波兰语区域设置.

  • 如果您使用`shopt -s globstar`启用Bash,则Bash支持`./**/*。ext`。这是Bash版本4中引入的。 (3认同)