Linux最通用的脚本语言是?


24

我们正在为Linux系统编写脚本,关于使用哪种最普遍的Linux当前脚本语言一直存在一些争论。Bash,SH,Posix?什么?


3
我猜sh
搅拌器

您有目标发行版列表吗?还是必须运行的强制性/理想发行版?

4
“ sh”?什么是“ sh”?汤姆森贝壳?伯恩贝壳?bash,ksh,pdksh,ash,zsh与/bin/sh在系统XY上找到的一样?POSIX sh规范,SUSv3,SUSv4 sh规范,LSB sh规范?“ sh”本身并不意味着任何东西。
斯特凡Chazelas

1
如果这是针对软件构建和安装脚本的,则您可能要签出Autotools,以尝试解决跨系统编译问题。
Lie Ryan

1
@sch“最明显”是最易携带的常见交集。如果人们不熟悉Unix外壳被你误导的评论,POSIX的规范是由敢用名字去几乎所有的现代炮弹实施sh,以及不符合规定的sh不古和时下罕见的(如伯恩)。人们可能会tle发出越来越多的扩展和变更清单,但是如果目标是“通用”或可移植性,则应该朝相反的方向发展。吉尔斯的答案更深入地涵盖了细节。
jw013 2012年

Answers:


38

每个类似unix的操作系统上都有两种编程环境,它们都是图灵完备的,并且可以调用其他程序:awksh,Bourne / POSIX shell系列。AWK面向文本处理(它补充了更多的专用实用程序),而sh则面向成为将程序组合在一起的粘合语言。Sh是Linux和整个Unix世界上通用脚本语言。

POSIX标准定义的sh本身和相关的设施的强制特征。大多数类unix的系统都符合POSIX 1003.1-2004(又名Single Unix v3,又名Open Group Base Specification第6期);该标准的最新版本是POSIX 1003.1-2008(又名Single Unix v4,又名Open Group基本规范第7期)。

每个Linux和unix或类似Unix的系统在路径上都具有Bourne样式的外壳/bin/sh,而任何非古色古香的系统都具有POSIX兼容的外壳(除非出现偶然的错误)。每个现代的类unix系统(包括Linux)都支持shebangs,因此/bin/sh如果第一行是,它会自动运行in脚本#!/bin/sh。有些POSIX系统sh位于另一个位置(通常是OS上的仿真层,您不会认为它真的像Unix一样)。

嵌入式Linux系统可能具有未实现所有POSIX功能的精简BusyBox系统。BusyBox具有大量的编译时选项以适应小型系统,因此很难事先知道会发生什么,因此必须针对特定设备定制脚本。BusyBox是sh和各种实用程序的最常见的小型实现;您可能会遇到的另一种情况是Android中的外壳环境大大减少(以后的版本较贫乏)。

非嵌入式Linux系统几乎总是要么破折号庆典/bin/sh。Dash是一个小型且快速的shell,除了POSIX功能外还实现了其他功能。Bash是具有更多功能的较大外壳。

非嵌入式Linux系统几乎总是将Bash安装为/bin/bash。因此,为了在非嵌入式Linux系统上具有可移植性,您可以假定bash可用。bash有用的附加功能包括数组,方便处理点文件的功能,pipestatus用于获取管道中所有命令的返回状态的变量,用于文件时间的附加比较运算符以及(在最新版本中)正则表达式匹配。

Shell编程的特征之一是您不仅在使用该sh程序,而且还在使用许多实用程序。Linux上的大多数文件操作和文本处理实用程序都是GNU coreutils(在嵌入式系统上,它们通常来自BusyBox)。

如果您需要Linux以外的可移植性,最好的选择是坚持使用POSIX。其他unix变体可能未安装bash(bash是OSX上标准安装的一部分,但是* BSD和大多数商业unice上的可选软件包)。除Linux和OSX以外,几乎所有的unix变体(即* BSD和商用的unices)都具有Korn shell的某些版本,至少是pdksh。bash的许多方便扩展都来自ksh,因此编写可以在两者下运行的脚本会很有用,但是检测bash或ksh在未知系统上的位置可能会有些麻烦。

外壳不能做所有事情。如果您需要更复杂的语言,则可以选择两个更常见的选择:Perl和Python(其他任何作为unix脚本语言都落后的地方)。Perl是传统的脚本语言,很少有非嵌入式Linux系统缺少它,但是Python逐渐普及(在某种程度上,它是Ubuntu推荐的脚本语言)。在非Linux世界中,Perl是OSX和OpenBSD上的基础安装的一部分。它是可选的,但通常安装在FreeBSD上,并且是可选的,但通常安装在NetBSD上。


1
Fedora和RHEL系统完全需要它“部分地由……增强”。
伊格纳西奥·巴斯克斯

大多数情况下都同意。只是一些不同的重点:*一些发行版是基于BusyBox的,但不一定是嵌入式的(我使用Alpine)。(当然,答案的确是“几乎总是”。)* BSD是一类类似于Unix的系统,默认情况下您不能假定bash。*破折号几乎可以完成bash的所有工作,只是有时需要更多的照顾。*如果需要更复杂的语言,可以选择Perl和Python,但是awk更为普遍,并且可以满足许多目的。它通常也被低估了。但这比Perl和Python轻。
dubiousjim 2012年

2
不过,这是一个合理的警告-FreeBSD在一段时间前从默认安装中删除了Perl。除此之外,我不知道其他发行版的基本安装中没有Perl。
TC1 2012年

@ TC1 Perl在NetBSD上始终是可选的。它在OpenBSD的基本系统中。
吉尔斯(Gillles)“所以-不要再邪恶了”

@dubiousjim只有Linux(非嵌入式,或在实践中足够好近似)和OSX的默认安装中包含bash。* BSD具有pdksh或mksh,而商业单位具有ATT ksh。
吉尔(Gilles)“所以,别再邪恶了”

11

按可用性顺序:

  1. sh,但请坚持使用POSIX指定的设施。
  2. bash,但不要忘记在shebang中明确指定它,否则您可能会破折号。
  3. 蟒蛇。几乎每个人都使用它。
  4. Perl。但是你要写它。

在那之后,没有人真正在乎,因为没有什么是您不能做的。


10
我将PERL放在python之前,它在大多数linux系统中默认安装。
terdon

4
Perl是#3。然后您就可以编写它了,奖金!:)
沃伦·扬

2
我同意@ignacio perl是#4,而python是#3。原因很明显。我认为Python是perl的演变。
bagavadhar

5
@ashwin:不,python不是perl的演变,甚至不是。perl是sysadmins为sysadmins提供的一种语言。python是程序员针对程序员的一种语言。这种差异至关重要。它们都有用途,虽然用例可能有很多重叠,但是对于某些任务,perl是更好的选择,而对于另一些任务,python显然更好。
cas 2012年

1
Ruby和PHP受到Perl的启发。Python是一项物理实验的结果,他们在超级对撞机中创建了反Perls。(我对Python没有任何看法。优点和缺点,优点和缺点。)
Warren Young

4

通常,我会说sh....但是自从您指定了Linux之后,我就说bash-保证它可以在周围的每个Linux系统上使用(嗯,不包括那些迷恋极简主义的晦涩的,笨拙的小系统:)。

如果您不必在乎非Linux的可移植性(并且不需要在小型发行版上或在嵌入式Linux设备(例如塑料盒路由器)中运行),那么您也可以利用这些重要的增强功能它提供了平原sh。否则使用sh

bash(和sh)之后,Linux下第二种最“通用”的脚本语言将是某种方言awk-通常为mawkgawk。如果您坚持使用简单的awk并避免偏执,那么您的脚本应该可以在几乎所有Linux系统上正常运行(在小型发行版或嵌入式设备上可能会丢失)。大多数Linux系统将同时具有mawkgawk可用的功能,但mawk默认情况下已安装了某些发行版(例如,debian),gawk如果需要,则必须自行安装。

接下来是perl。AFAIK,基本perl语言默认情况下安装在所有常见Linux发行版上,因此使其成为不错的选择。更幸运的是,与perl5发行版之间的版本兼容性极少(尽管perl 5.12或可能是5.14最终才删除了一些已经弃用了约15年的晦涩功能...警告不要使用它们)除非您的编码风格确实很怪异,并且您想忽略过去十年来的“请勿这样做”警告,否则您的perl脚本几乎可以在任何地方运行。语言是强大的,强大的,可以做的一切,awksed可以做多。只需一点努力,它就可以完成sh传统上也有好处(例如,运行外部命令并使用/配管输出)。标准的perl库也非常全面-不仅涵盖基础知识。

perl的唯一收获是,还有一个庞大的CPAN模块库可以执行您可以想到的任何事情(还有很多您可能永远不会想到的事情)-并非所有这些都可以在使用perl的每个系统上使用。它们通常质量很高,因此很容易养成只使用它们的习惯-但是,如果您确实使用它们,则必须确保已安装它们。许多CPAN模块已预先打包为Linux使用,其余的可通过cpan工具轻松安装(或dh-make-perl在debian / ubuntu / etc上安装,以将CPAN模块转换为.deb软件包)。

python接下来,我想说,但是我不能。关于python有很多优点,但是在许多Linux系统上默认不包含python,并且坦率地说,它的版本兼容性(既适用于python本身,也适用于所谓的“标准”库)。有些发行版在清理混乱方面付出了巨大的努力,而有些则没有。python基本上是程序员(而不是sysadmin)为程序员编写的一种语言,而且他们似乎也不认为将要安装其代码的系统根本很重要,这两个事实都无济于事。真的非常特别,因此他们不必担心无聊的事情,例如集成到现有系统中。

(不要从我的讽刺中得到错误的主意-我真的很喜欢python作为一种语言,我只是讨厌版本和依赖项管理是PITA的事实。这就像回到了20多年的手动寻找模糊时代少量的代码和补丁,以在您的专有* nix上编译并运行某些东西


我知道这是一个古老的职位,但绕过这个最好的办法就是到指定的家当版本(例如/usr/bin/python2/usr/bin/python3)。
Isiah Meadows 2014年

1

我建议遵循ksh93甚至POSIX风格,并且您始终可以使用bash / zsh来运行。

基于Debian的发行版使用mawk而不是gawk作为默认awk。所以是的,请避免添加gawk,因为mawk的速度更快。


0

不重击。写入像dash或ash这样接近POSIX的sh。那将是最普遍的。我认为没有什么比这更接近竞争对手了。(在我看来,这似乎是一个事实问题,而不是评论员之一抱怨的“意见”。)

如果您需要比sh强大的功能(例如,如果您需要真正的关联数组),请使用awk。(避免使用gawk扩展。awk有许多版本,但是有一个广泛共享的内核。)应该几乎和sh一样广泛地使用。


1
Linux上的awk是通用的gawk;我想不出任何默认情况下具有其他变体的发行版。
伊格纳西奥·巴斯克斯

5
哪些Linux版本不支持bash
乔纳森·勒夫勒

1
当然bash可以(几乎)在任何Linux机器上安装和运行,但是许多debian用户只会安装dash而不愿意安装bash
William Pursell 2012年

6
@WilliamPursell bash软件包在Debian上被标记为Essential(即,您必须经过箍才能卸载,并带有充分的警告,这会危害您的系统)。Bash在非嵌入式Linux系统上几乎是通用的。
吉尔(Gilles)'所以

1
@JonathanLeffler:相反,嵌入式的可能只有Busybox。
机械蜗牛

0

我会说可用性将按以下顺序排列:

  1. SH
  2. awk
  3. Perl(我还没有看到没有它的* nix,包括BSD)

尽管Python听起来像是一门好语言,但我没有在基本安装中使用过它附带的任何操作系统,尽管显然Ubuntu可以,也许吗?


0

我相信这里的专家已经提供了很好的建议,应该可以帮助您做出决定。其他文章很好地描述了不同shell的可用性和可用性。

另一方面,如果我是您,我还将考虑我希望通过脚本实现的目标。每个工具都有其优点和缺点。因此,尽管我主要使用Python,但我不会在每种情况下都使用它。

我可以想到一些场景,并提及一些对他们有用的工具。

FTP文件往返 处理它们;发送电子邮件通知;等等

在这种情况下,这将是更好地与外壳(如bash)的坚持和使用各种工具(例如ftpcronmail)。这是许多大公司的典型用例。

快速文字处理

再次,外壳。公用事业喜欢grepawksedpaste和其他人在这种情况下非常方便。

建立

在C / C ++域中,通用工具是make。Java世界更喜欢Apache ANT。

部署和远程控制

Shell或Python。例如,scprsync分别对复制文件或同步文件非常有用。

另一方面,Python有一个非常有用的模块,名为fabric。这对于更复杂的操作(例如,复制文件,停止某些进程,启动服务器等)很有用。此外,Python还提供了一个模块,pip可以通过下载和安装相关的软件包来解决指定的依赖性。

(请注意,以上建议并未将重点放在外壳功能上,而是在可用的不同实用程序上。)


-1

很抱歉,Perl不在FreeBSD,NetBSD或DragonflyBSD的基础上。OpenBSD在基本安装中具有Perl。如今,OS X是经过认证的UNIX,并且可以在某种程度上被认为是某种BSD变体,并且它具有Perl,Python和Ruby。

许多专有的UNIXen都没有Perl,例如Solaris,AFAIK,HP-UX或IBM AIX都没有。


您关于Solaris缺少Perl的陈述是不正确的。至少从2005年(Solaris 10)开始,Perl是Solaris的强制性核心组件。
jlliagre
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.