Shell脚本与Python相比的优势[关闭]


94

我尝试了几次学习shell(bash)脚本的过程,但是却被语法所取代。然后,我找到了Python,并且能够完成Shell脚本可以在Python中完成的大部分工作。我现在不确定是否应该再花时间在学习shell脚本上了。所以我想问:

与Python相比,shell脚本有哪些优势使其成为必不可少的工具?

我不是专业的系统管理人员,但是我对为家庭用户设置Linux系统感兴趣,因此我认为学习Shell脚本可能变得必要。

Answers:


82
  • Shell脚本具有用于I / O重定向的更简单的表示法。
  • 从Shell中的现有程序创建管道更简单。
  • Shell脚本重用了整个程序。
  • Shell是通用的(在Unix之类的东西上)-不一定要安装Python。

“的确,您可以在Python中完成所有可以在Shell中完成的工作;同样,在Python中有些容易实现的事情在外壳中很难实现(就像有些东西在Shell中实现容易但在Python中很难实现一样)。从长远来看,了解两者将是最好的。


16
1和2,好点。#3是一个弱点,因为它导致Python可以避免的大量开销。#4在很大程度上可能是不真实的。Python现在是大多数Linux发行版的一部分。
S.Lott

1
@Svante:编写一个简单的shell循环,使用诸如“ test”和“ expr”之类的命令进行许多操作,并将运行时间与使用“ os”模块的Python脚本进行比较。诸如test和expr之类的命令通常涉及派生一个子流程来完成实际工作。
S.Lott

2
我认为第3点是巨大的优势,而不是劣势。例如,考虑使用转换程序调整充满图像的目录的大小。
格伦

7
关于#4还值得注意的是,bash并不是所有Linux发行版(特别是嵌入式系统的那些发行版,以及其他运行busybox可执行文件的发行版)都不能普遍使用该外壳程序。面向Bourne shell本身的脚本bash(向后兼容)将在所有POSIX兼容的系统上运行,但是该语言比所实现的语言受限制得多bash
直觉

5
@intuited:eval“ $(历史2 | head -1 | perl -pe's /(?<=更是/至少/'))”; 历史-d $(历史2 |头-1 |的sed的/ ^ \ S *([0-9] \ +)/ \ 1 /')
直觉

54

“与Python相比,shell脚本有什么优势使其成为必不可少的工具?”

外壳不是必不可少的。您为什么认为有这么多?bash,tcsh,csh,sh等,等等,

Python 一个外壳。这不是理想的运行脚本,而不是用于运行所有命令的脚本。

Python是所有Linux发行版中的或多或少的标准部分。

更传统的外壳会做很多事情。

  1. 他们有一个方便的用户界面来运行命令。这包括单行命令,shell在其中搜索您的PATH,派生并执行所请求的程序。它还包括管道,序列和并发程序(使用;|&),以及一些重定向(使用><)。

  2. 它们具有运行脚本的简陋的类似于编程语言的功能。这种语言很难使用,效率极低。这种语言的大多数语句都需要分叉一个或多个其他过程,从而浪费时间和内存。

从shell运行程序,将stderr重定向到日志文件,这样的事情就很好了。在外壳中执行该操作。

作为Python脚本,几乎所有其他内容都可以更高效,更清晰地完成。

你们两个都需要。但是,永远不要使用传统的外壳语言编写带有if语句或循环的脚本。


1
@intuited。A)不同壳的扩散证明了“壳”中增加的特征数量;它不是必不可少的角色,但却是功能的全部。B)python解释器是正确的unix shell,它使用#!。C)“简单”的shell if语句通常涉及运行test程序。在所有方面,shell是一种糟糕的编程语言。
S.Lott 2010年

4
@S。Lott:这里的电路似乎有些语义上的不和谐。我对UNIX shell的定义是一个解释器,其语言主要用于在更高层次上控制UNIX系统的操作。根据这个定义,某种外壳对于UNIX系统的运行无疑是必不可少的,而Python不符合条件。您如何定义该术语?
直觉

1
@ S.Lott:我不是传统shell脚本中使用的语法的忠实拥护者,但是我发现它非常有用,并且在许多主要目标是控制过程及其输出流的情况下适用。这通常需要决策和迭代。现代外壳程序(bash至少是)具有内建函数来处理决策(例如testbash内建函数,以及更多通用的构造)。它当然有其弱点,也有其优点。还值得详细学习,因为它是与其他类型的语言截然不同的范例。
直觉

1
@intuited:“发现它非常有用”是对您的技能的致敬,而不是拙劣的语言。不熟练的人可以使用Python。
S.Lott

3
@ S.Lott:有趣的是,您的哲学与我完全不同。我认为设计和操作基本上就是鸡和蛋。也就是说,shell脚本是运行程序的程序。这些程序中的许多最初都是作为越来越复杂的Shell脚本实现的。从某种意义上说,变得有价值,可能是出于效率的考虑而与模块化一样重要,因为其中一些要用C和后来的Python来重写。例如:在某些时候cat "$1" | ssh "$2" "cat - >\"$1\""生了scp。他们知道如何最好地设计它,因为他们已经在使用它。
直觉

31

Shell使普通和简单的动作真正简单了,但代价是使更复杂的事情变得更加复杂。

通常,一个小的Shell脚本会比相应的python程序更短,更简单,但是python程序会趋于优雅地接受修改,而随着代码的添加,shell脚本的可维护性会越来越少。

这样的结果是,为了获得最佳的日常生产力,您需要shell脚本,但是您应该主要将其用于一次性脚本,并在其他地方使用python。


14

Shell脚本无可比拟,而Python则无能为力。Shell脚本的最大优点是,您使用的命令与使用Shell时使用的命令相同,因此,如果您是大量Shell用户,则Shell脚本有时会成为一种非常快速简便的方法来自动执行Shell工作。

我也发现在shell脚本中处理数据管道比在python中更容易,尽管它在python中绝对可行。

最后,您不必启动其他干扰程序即可运行Shell脚本,从而为您提供了非常小但有时可能在速度和内存使用方面的明显优势。

但是话又说回来,Python脚本更具可维护性,因此我正试图从大型的难看的Shell脚本迁移到Python脚本。使用Python进行异常处理和质量检查也更加容易。


9

前面的所有答案都表明,不必学习shell脚本。但是学习永远不是一件坏事。这实际上是个人优先级的问题。别人很难告诉您什么是不值得的。

大多数程序员发现,每次学习新语言都会变得越来越容易。(自然语言也是如此。)并且越早开始越好。

加:学习了一门语言,使您可以从完全的知识和熟悉的位置上摆脱它的局限性。这可能不会让你被解雇,但是可能会从同龄人那里获得啤酒!


8

我同意以前的大多数答案。我认为Shell命令最适合执行面向文件系统的任务(复制和移动文件,grep等)。我认为,如果您必须读写文件,那么Shell会更好,因为单个>>file.txt重定向会立即添加到文件中,而不是像file=open('file.txt','a'); file.write()等等。

目前,出于个人用途,我混合了两种方法,分别是创建一个python脚本,然后每次在shell中比在python中更容易执行某个操作时就调用os.system('command')或os.popen('command')。


6

该外壳随处可见。如果您坚持使用一套相对基本的可移植功能,则您的脚本可以在手机,无线路由器,DVR,上网本,工作站,大型钢铁服务器等上运行。在许多系统上,Python不一定是开箱即用的,根据环境的不同,可能很难安装它。

学习一些shell脚本也可以帮助您学习一些命令行技巧,因为命令行是shell。这对于采取一些相当长且复杂的命令行,并在您意识到您将需要更多的命令行之后将其转换为更通用的脚本也很有用。

该外壳还具有一些非常强大的功能。据我所知,管道是一个非常有趣的控制结构,仅对外壳是本地的。


5

选择Python的Shell脚本时要考虑的另一件事是将在目标计算机上运行的Python版本。RHEL5(仅举一例)将存在很长时间。RHEL5停留在Python 2.4中。有很多不错的库,它们依赖于2.4后的Python添加的功能。

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.