我开始熟练掌握Linux环境,并且我试图在命令shell脚本方面选择一种武器(因为我仍然是一个很大的n00b),这将有助于我(和其他人)管理,测试和管理在* NIX环境中运行的一组服务器端应用程序。
我的问题是:当考虑以下标准时,首选的命令shell是什么:
对于从未接触过shell脚本的初级开发者来说,学习/理解它有多容易?
是否有大量的开发人员知道这个shell脚本?
它是否安全且易于使用 - 脚本错误是无声的还是提供智能错误输出,是否会让那些不知情的人在脚下自我射击?
它有多便携? - 我可以期望在OpenSolaris以及Redhat,FreeBSD中运行相同的脚本吗? (授予特定操作系统的命令语法和选项将相应更改)
标准如何?它是否应该被包含在* NIX的大多数发行版中,还是必须另外安装?
我知道有些营地对特定指挥炮弹持强烈的感情,我只是在寻找知情的意见。
答案 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强制要求。
鉴于你的目标,我看到三个选择:
忘掉脚本的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)
据说zsh是现在最强大的,所以我建议尝试一下。
为什么我更喜欢zsh (Z shell)到bash:
for file in ./**/*.java; do ...
(我的意思是./**/*.ext
)rm *
:)dmdomi[tab]
并建议dnddomainname
。 java
希望将类名作为第一个参数,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。