Answers:
典型的大型机流程...
Input Disk/Tape/User (runtime) --> Job Control Language (JCL) --> Output Disk/Tape/Screen/Printer
| ^
v |
`--> COBOL Program --------'
典型的Linux流程...
Input Disk/SSD/User (runtime) --> sh/bash/ksh/zsh/... ----------> Output Disk/SSD/Screen/Printer
| ^
v |
`--> Python script --------'
| ^
v |
`--> awk script -----------'
| ^
v |
`--> sed script -----------'
| ^
v |
`--> C/C++ program --------'
| ^
v |
`--- Java program ---------'
| ^
v |
: :
像sh / ksh / bash / ... 这样的Linux shell 提供输入/输出/流控制指定功能,就像旧的大型机Job Control Language ...一样,但是在类固醇上!它们本身就是图灵完整的语言,同时经过优化以有效地将数据和控制传递给O / S支持的以任何语言编写的其他执行过程和从其他执行过程进行传递。
大多数Linux应用程序,无论程序的大部分语言是哪种语言,都取决于shell脚本,而Bash已成为最常见的应用程序。单击桌面上的图标通常会运行一个简短的Bash脚本。该脚本直接或间接知道所有所需文件的位置,并设置变量和命令行参数,最后调用程序。这是shell最简单的用法。
然而,众所周知,如果没有成千上万的外壳脚本来启动系统,响应事件,控制执行优先级以及编译,配置和运行程序,几乎就不会是Linux。其中许多都是非常大而复杂的。
Shell提供了一种基础结构,使我们可以使用在运行时而不是编译时链接在一起的预构建组件。这些组件本身就是独立的程序,可以单独使用或以其他组合使用,而无需重新编译。调用它们的语法与Bash内置命令的语法没有区别,实际上,有许多内置命令,在系统上也有独立的可执行文件,这些命令通常具有其他选项。
Python和Bash在性能上没有语言范围的差异。这完全取决于每个代码的编码方式以及调用哪些外部工具。
任何众所周知的工具,例如awk,sed,grep,bc,dc,tr等,都将以任何一种语言进行操作。然后,对于没有图形用户界面的任何事物,Bash都是首选的,因为从Bash之类的工具中调用和传递数据比从Python那里更容易,更有效。
它的总体吞吐量和/或响应能力是否好于等效的Python取决于Bash shell脚本调用的程序及其对子任务的适用性。使事情复杂化的是,Python和大多数语言一样,也可以调用其他可执行文件,尽管它比较麻烦,因此不常用。
一个领域的Python是明显的赢家是用户界面。这使其成为构建本地或客户端服务器应用程序的极佳语言,因为它本身支持GTK图形,并且比Bash直观得多。
Bash仅能理解文本。必须为GUI调用其他工具,并从这些工具传回数据。一个Python的脚本是一个选项。更快但更不灵活的选项是YAD,Zenity和GTKDialog之类的二进制文件。
虽然像Bash这样的shell 可以与Yad,GtkDialog(GTK +函数的嵌入式XML相似的接口),dialog和xmessage等GUI很好地配合使用,但Python的功能更加强大,因此对于复杂的GUI窗口也更好。
使用Shell脚本进行构建就像使用台式机组装具有现成组件的计算机一样。
使用Python,C ++或大多数其他语言进行构建更像是通过像智能手机一样将芯片(库)和其他电子零件焊接在一起来构建计算机。
通常,只有在python不可用的环境中,bash才能比python更好。:)
认真地讲,我每天都必须处理两种语言,并且如果可以选择的话,Python将比bash立即使用。las,我被迫在某些“小型”平台上使用bash,因为有人(错误地,恕我直言)认为python“太大”以致无法容纳。
虽然对于某些选择任务,bash的确可以比python快,但它的开发速度或维护速度都不可能如此之快(至少在经过10行左右的代码之后)。Bash的无处不在是python或ruby或lua等的唯一优点。
os
或shutil
模块命令慢得多。
在编写脚本时,性能并不重要(在大多数情况下)。
如果您关心性能,“ Python vs Bash”是一个错误的问题。
Python:
+易于编写
+易于维护
+代码重用(尝试在通用代码中找到通用的防错方法来包含文件sh
,我敢)
+您也可以使用OOP!
+更轻松的参数解析。好吧,确实不容易。它仍然太罗to了,但python argparse
内置了功能
。-丑陋的'subprocess'。尝试链接命令,不要哭了,您的代码将变得多么丑陋。特别是如果您关心退出代码。
Bash:
+如前所述,无处不在。
+简单的命令链接。这就是您以简单的方式将不同的命令粘合在一起的方式。也Bash
(不是sh
)也有一些改进,例如pipefail
,因此链接确实很短且富有表现力。
+不需要安装第三方程序。可以立即执行。
-天哪,到处都是陷阱。IFS,CDPATH ..数千种。
如果编写的脚本大于100 LOC:请选择Python
如果需要在脚本中进行路径操作:请选择Python(3)
如果需要一些类似于alias
但有点复杂的:请选择Bash / sh
无论如何,一个人应该尽力让双方了解他们的能力。
也许可以通过打包和IDE支持点来扩展答案,但是我对此并不熟悉。
与往常一样,您必须选择粪便三明治和巨型水饺。请记住,仅在几年前,Perl就是新希望。现在在哪里。
在进程启动时,性能方面的bash优于python。
以下是我的运行Linux Mint的核心i7笔记本电脑的一些测量结果:
Starting process Startup time
empty /bin/sh script 1.7 ms
empty /bin/bash script 2.8 ms
empty python script 11.1 ms
python script with a few libs* 110 ms
* Python加载的库是:os,os.path,json,时间,请求,线程,子进程
这显示出巨大的差异,但是如果bash必须做任何明智的事情,因为它通常必须调用外部进程,则执行时间会迅速缩短。
如果您关心性能,请仅将bash用于:
/bin/echo
比bash表现好很多,这很难衡量。因此/bin/echo mycommand > named_pipe
,除了运行bash之外,您还可以使用(将命令/消息输出到命名管道或套接字)...并使后台Python进程从该管道读取命令/指令并运行它们。因此,bash并不是一个很好的“启动成本优化”。
Bash主要是一种批处理/ shell脚本语言,对各种数据类型和围绕控制结构的各种怪癖的支持要少得多,更不用说兼容性问题了。
哪个更快?两者都不是,因为您这里没有将苹果与其他苹果进行比较。如果您必须对一个ascii文本文件进行排序,并且正在使用zcat,sort,uniq和sed之类的工具,那么您将明智地利用Python性能。
但是,如果您需要一个支持浮点和各种控制流的适当编程环境,那么Python无疑是明智之举。如果您在Bash和Python中写了一个递归算法,则Python版本将赢得一个数量级或更多。
我之所以发布此最新答案,主要是因为Google喜欢这个问题。
我认为问题和背景确实应该与工作流程有关,而不是工具。总体理念始终是“使用正确的工具完成工作”。但是在此之前,许多人常常在工具迷路时忘记了这一点:“完成工作”。
当我遇到一个尚未完全定义的问题时,我几乎总是从Bash开始。我已经解决了大型Bash脚本中易读且可维护的一些棘手问题。
但是问题什么时候开始超过应该要求Bash做什么的呢?我有一些支票可以用来警告我:
清单继续。底线是,当您为添加功能而更加努力地保持脚本运行时,该离开Bash了。
假设您已决定将工作移至Python。如果您的Bash脚本干净,则初始转换非常简单。甚至还有几个转换器/翻译器将为您做第一遍。
下一个问题是:您放弃转向Python的什么?
必须将对外部实用程序的所有调用包装在subprocess
模块(或等效模块)中的某些内容中。有多种方法可以做到这一点,直到3.7,它才花了点力气才将其改正(改进subprocess.run()
了3.7,可以自行处理所有常见情况)。
令人惊讶的是,Python没有用于轮询键盘(stdin)的标准独立于平台的非阻塞实用程序(带有超时)。Bash read
命令是一个很棒的工具,用于简单的用户交互。我最常见的用法是显示一个微调框,直到用户按下某个键为止,同时还运行轮询功能(每个微调框步骤都执行一次),以确保一切运行正常。这是一个比刚开始时要棘手的问题,所以我经常简单地打电话给Bash:昂贵,但这恰恰满足了我的需求。
如果您是在嵌入式或受内存限制的系统上进行开发,Python的内存占用量可能是Bash的很多倍(取决于手头的任务)。另外,内存中几乎总是有一个Bash实例,而Python可能并非如此。
对于只运行一次并快速退出的脚本,Python的启动时间可能比Bash的启动时间长得多。但是,如果脚本中包含大量计算,Python会迅速前进。
Python具有地球上最全面的软件包系统。当Bash变得稍微复杂时,Python可能会提供一个程序包,使整个Bash块成为单个调用。但是,找到合适的软件包成为Pythonista的最大也是最艰巨的任务。幸运的是,Google和StackExchange是您的朋友。
我不知道这是否正确,但是我发现python / ruby在具有大量数学计算的脚本中效果更好。否则你必须使用dc
或其他“任意精度计算器”。这只是一个很大的痛苦。使用python,您可以更好地控制浮点数和整数,并且有时执行许多计算要容易得多。
特别是,我永远不会使用bash脚本来处理二进制信息或字节。相反,我会使用python(也许)或C ++或什至Node.JS之类的东西。
在性能方面,两者可以做同样的事情,所以问题就变成了节省更多开发时间的问题?
Bash依赖于调用其他命令,并通过管道传递它们来创建新命令。这样做的好处是,无论他们使用什么编程语言,都可以使用从其他人那里借来的代码快速创建新程序。
这也具有很好的抵抗子命令更改的副作用,因为它们之间的界面只是纯文本。
另外,Bash在如何编写方面非常宽容。这意味着它可以在更广泛的上下文中很好地工作,但是它也依赖于程序员以一种干净安全的方式进行编码的意图。否则,Bash不会阻止您制造混乱。
Python的样式更加结构化,因此凌乱的程序员不会那么凌乱。它也可以在Linux以外的操作系统上运行,如果需要这种可移植性,使其立即变得更合适。
但这并不是调用其他命令那么简单。因此,如果您的操作系统是Unix,那么您将发现在Bash上进行开发是最快的开发方法。
何时使用Bash:
何时使用Python: