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脚本需要一个显式循环才能移动文件,而这是
mv
bash中命令语义的一部分
- bash脚本可以运行得更快-您可能会从bash调用它,并且可以使用
source
它在相同的Shell实例中运行
glob.iglob("./*.png")
只是说了一口 *.png
如果您想用Python编写基本的管道操作,那么您会感到惊讶。(当然grep
,可以通过Python代码来代替诸如通过进行管道传递之类的某些事情,而无需使用外部程序,因此您通常不需要进行过多的管道传递。)
作为反例,我曾经不得不编写一个例程来检查每个文件名在特定目录中的存储时间。如果它们的长度超过特定操作系统所支持的长度,则必须将其缩短。这可能会导致重复的文件名,而我需要进行纠正,并且由于它们是从网页链接的,因此缩短的名称必须稳定,即,它们的生成方式应始终使相同的长文件名导致相同的缩短文件名。为此,我生成了一个长文件名的十六进制md5,并将其前四个字符附加到简称中(名称可能仍然会发生冲突,但这非常不危险,因此我只是检查了这种情况并保释了是否可能发生) 。
我用bash进行了此操作,因为它是我们已经用bash编写的构建系统的一部分。正像您可能正在思考的那样,很难做到正确。用Python编写将花费更少的时间,并且可能也将更加清晰。
简而言之:针对不同类型的任务设计了不同的语言;选择最适合您手头任务的语言。