与解释型编程语言相比,shell脚本有何优势?[关闭]


15

(我不确定这是否是一个适当的问题)

就像用编写的脚本一样,Shell脚本bash可以完成许多工作。他们可以调用Unix程序,输出其输出,将I / O从文件重定向到文件,控制流,检查文件是否存在等。

但是现代编程语言(例如pythonruby)也可以做这些事情。而且,它们(我认为)更具可读性和可维护性。

bash享有广泛的采用。但是许多发行版也安装了python解释器。

那么shell脚本的好处是什么?如果我能写pythonruby还是perl值得学习bash


3
如果您在Unix系统上工作很多,则应该学习bash以及其他流行的Unix shell。
伯纳德

Answers:


30

Shell具有用于处理文件并将数据从一个程序获取到另一个程序的特殊功能(假定数据是文本)。对于这些任务,shell脚本要比Python之类的脚本语言麻烦一些。

Shell脚本编写还具有一个优势,即您所使用的命令基本上与您在命令行中使用的命令相同-因此,如果您可以在Shell中执行某些操作,那么编写相同操作的过程还不止一半。

例如,这里有一个bash脚本,它将所有PNG文件从当前目录移动到指定目录。

#!/usr/bin/sh
mv *.png $1

这是Python版本。

#!/usr/bin/python
import sys, shutil, glob
for filename in glob.iglob("./*.png"):
    shutil.move(filename, sys.argv[1])

您会注意到:

  • 如果您计算行数(不包括shebang行),则bash脚本的长度是Python的三分之一-按字符数计算甚至更少
  • Python脚本需要导入三个库,而此任务所需的所有内容均可在bash中本地获得
  • Python脚本需要一个显式循环才能移动文件,而这是mvbash中命令语义的一部分
  • bash脚本可以运行得更快-您可能会从bash调用它,并且可以使用source它在相同的Shell实例中运行
  • glob.iglob("./*.png") 只是说了一口 *.png

如果您想用Python编写基本的管道操作,那么您会感到惊讶。(当然grep,可以通过Python代码来代替诸如通过进行管道传递之类的某些事情,而无需使用外部程序,因此您通常不需要进行过多的管道传递。)

作为反例,我曾经不得不编写一个例程来检查每个文件名在特定目录中的存储时间。如果它们的长度超过特定操作系统所支持的长度,则必须将其缩短。这可能会导致重复的文件名,而我需要进行纠正,并且由于它们是从网页链接的,因此缩短的名称必须稳定,即,它们的生成方式应始终使相同的长文件名导致相同的缩短文件名。为此,我生成了一个长文件名的十六进制md5,并将其前四个字符附加到简称中(名称可能仍然会发生冲突,但这非常不危险,因此我只是检查了这种情况并保释了是否可能发生) 。

我用bash进行了此操作,因为它是我们已经用bash编写的构建系统的一部分。正像您可能正在思考的那样,很难做到正确。用Python编写将花费更少的时间,并且可能也将更加清晰。

简而言之:针对不同类型的任务设计了不同的语言;选择最适合您手头任务的语言。


您不能在perl#/ usr / bin / perl中执行相同的操作mv *.png $1(注释不保留格式),但是在perl中,您也可以使用高级语言功能。
波马2012年

19

现有的答案也是有效的,但是有一个没有人提及的原因:因为它将在那里。

任何给定的* nix安装都是通过一组可能会或可能不会加载的可选软件包完成的,并且并非所有系统都将具有Python或Perl或Ruby。但是,如果期望该系统完全具有任何交互功能,则它将具有外壳。这意味着在支持可写文件系统和bash命令行的任何系统上,shell脚本都可以在服务器,程序员桌面,秘书瘦客户机桌面以及嵌入式设备等系统上运行。

对于只在一致的服务器环境中工作的人来说,这是理所当然的,并不是那么重要。对于在更多样化的环境中工作的人来说,这一点不容忽视。


9

您的问题的很大一部分在这里得到了回答:

为什么脚本语言(例如Perl,Python,Ruby)不适合作为Shell语言?

这是我对这个问题的回答的摘录:

我可以想到几个不同之处。只是在这里思考,没有特别的顺序:

  1. Python&Co.被设计为擅长编写脚本。Bash&Co.被设计为擅长脚本编写,绝不妥协。IOW:Python被设计为既擅长脚本编写又擅长使用非脚本编写,Bash只关心脚本编写。

  2. Bash&Co.是无类型的,Python&Co.是强类型的,这意味着数字123,字符串123和文件123是完全不同的。但是,它们不是静态类型的,这意味着它们需要具有不同的字面量才能使它们分开。例:

    • Ruby :(123数字),Bash:123
    • Ruby :('123'字符串),Bash:123
    • Ruby :(正则/123/表达式),Bash:123
    • Ruby :(File.open('123')文件),Bash:123
    • Ruby :(IO.open('123')文件描述符),Bash:123
    • Ruby:URI.parse('123')(URI),Bash:123
    • Ruby :(`123`命令),Bash:123
  3. 蟒蛇及公司设计规模 10000,100000,甚至百万行程序,猛砸及公司设计规模下降到10名字符的程序。

  4. 在Bash&Co.中,文件,目录,文件描述符,进程都是一流的对象,在Python中,只有Python对象才是一流的,如果要操作文件,目录等,则必须将它们包装在首先使用Python对象。

  5. Shell编程基本上是数据流编程。没有人意识到这一点,甚至没有编写Shell的人也没有意识到,但是事实证明Shell在这方面非常擅长,而通用语言则没有那么多。在通用编程世界中,数据流似乎主要被视为并发模型,而不仅仅是编程范例。

我觉得尝试通过将功能或DSL连接到通用编程语言来解决这些问题是行不通的。至少,我还没有看到令人信服的实现。有RuSH(Ruby外壳),它试图在Ruby中实现外壳,有rush,这是在Ruby中用于外壳编程的内部DSL,还有Hotwire,这是Python外壳,但是IMO都没有一个接近与Bash,Zsh,鱼和朋友竞争。


断开的链接:您现在在哪里提到这个问题(和答案)?还是将所有有用的内容复制到这里?

1
@Wolf:显然,在将近三年之后,它因偏离主题而被删除。那真不幸。
约尔格W¯¯米塔格


1

我想说,在您只想起一个超级简单的自动化任务的情况下,shell脚本就具有优势。例如,如果您想编写一个脚本,每天在5:00时将目录从一台服务器备份到另一台服务器,那么使用繁重的编程语言可能会显得过头了。

另一方面,如果您的编程任务更需要控制结构(如果/然后/其他),迭代结构(循环),数据库和文件I / O等,那么它可能更适合于功能更强大的应用程序。编程语言比shell脚本。

我认为一个好的经验法则是:

automatingSimpleTask ? shellScript() : programmingLanguage();

2
不应该shellScript() if automatingSimpleTask else programmingLanguage() 大声笑。
gahooa

1
@gahooa haha​​显示我在篱笆的哪一边!
CFL_Jeff 2012年

1

尽管您可以从python / ruby​​ /任何程序启动程序,但外壳程序却有所不同。您可能需要使用API​​来启动某些内容-例如fork()。在shell脚本中,程序的行为更像是常规编程语言中的函数,并且可以以最小的工作量执行,管道传输等。使用管道,数据流也非常清晰。


0

如果您完全可以自由选择用于某些任务的编程语言,则可能几乎完全避免学习bash,并使用Perl,Python或Ruby来完成每个脚本编程任务。有时这可能会导致更冗长的解决方案,特别是在您只需要调用一系列其他Unix工具序列的脚本的情况下,但是在更复杂的情况下,您是对的,那些现代脚本语言为您提供了更多的可能性,以编写更好的可维护代码(它们也使您更有可能编写混淆代码,但这就是您的选择)。

另一方面,通常我们不能自由选择最喜欢的语言,因为我们必须使用遗留代码或知道bash但不知道您命名的一种脚本语言的人编写的代码。


0

Shell脚本一种解释型编程语言。我选择使用bash而不是perl或python或其他脚本语言编写脚本的一些原因如下:

随处可用:更复杂的解释器可能并不总是可用,例如在系统启动过程中或在嵌入式系统上。即使在busybox中也可以使用Bash。

在命令行上工作:如果您精通shell脚本,则可以在命令行上使用这些技能在即席脚本中完成复杂的工作。我每天以系统管理员的身份使用此技能。

编写调用其他程序的程序更容易:如果您要尝试以有趣的方式将几个现有程序链接在一起,那么在Shell脚本中执行操作比使用高级语言更容易。

如果程序不超过30行,我通常会使用Shell脚本编写它。如果有任何复杂的操作,复杂或分析需要处理,我将使用python或perl进行处理。


-1

您应该看一下coffeescript。他们的话:

在所有这些笨拙的花括号和分号之下,JavaScript始终具有一个华丽的对象模型。CoffeeScript试图以简单的方式公开JavaScript的优秀部分。

CoffeeScript的黄金法则是:“这只是JavaScript”。

好吧...这是超级初学者的答案。

作为过去6个月的自动学习初学者,并在最近几天品尝了C,C ++,Javascript和更多的Bashscript ...我可以告诉你:

像使用bash编写的脚本一样,Shell脚本可以执行许多操作。他们可以调用Unix程序,输出其输出,将I / O从文件重定向到文件,控制流,检查文件是否存在等。

这不是一个简单的幻想!?循环和变量?哇!

python和ruby,也可以做这些事情。而且,它们(我认为)更具可读性和可维护性。

请告诉我你在哪里看到的?我什至用geanygedit编写了bashscript,并且可以格式化(制表符?),并且与其他语言相比,我使用bashscript以光速读取了我的代码。

该语言还有其他保持秩序的工具吗?我知道面向对象可以节省很多代码,但是...人们说bashscript也是OO!哇2!这就是我的意思。正在去:

Shell脚本的优势

问题之内:如何在perl或phyton或ruby中执行此bashdamnthing可以做什么?这简单?

bashdamnthing = xdotool


WTF正在这里吗?这是一个像公爵答案..
naught101
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.