Bash脚本与Python脚本在重命令行工具中的优劣

6 投票
3 回答
2891 浏览
提问于 2025-04-16 03:23

我需要写一个脚本来完成以下几件事:

  1. 监控一个可以通过命令行访问的排队系统。
  2. 根据模板创建目录,使用一些文本编辑、复制/移动命令、命令行脚本和编译的C++程序。
  3. 检查错误情况。
  4. 在出现错误时写入文件。

注意:二维数组对我的程序会有一点帮助,但由于Bash脚本的数组限制,我现在只能用几个一维数组来应付。

这些任务看起来都比较依赖命令行,因为用一堆命令就能轻松实现,所以我觉得用Bash脚本是个自然的选择。到目前为止,我的结果还不错,但在我开始重构和完善代码之前,我在想是不是把它转到Python会更好。我在很多地方都看到说Python比Bash“更优秀”。我也写过一点Python脚本,感觉是因为它有更多内置库,并且支持面向对象编程。不过,我看到的所有使用命令行的脚本,比如这个:

http://magazine.redhat.com/2008/02/07/python-for-bash-scripters-a-well-kept-secret/

都有些烦人的语法,比如需要把命令定义为变量,像这样:

#You could add another bash command here
#HOLDING_SPOT="""fake_command"""

#Determines Home Directory Usage in Gigs
HOMEDIR_USAGE = """
du -sh $HOME | cut -f1
"""

#Determines IP Address
IPADDR = """
/sbin/ifconfig -a | awk '/(cast)/ { print $2 }' | cut -d':' -f2 | head -1
"""

...还需要一些包装函数和其他麻烦的东西。

我是不是太矫情了,还是说这看起来不太直观?使用Python会有速度上的优势吗,能超过Bash在处理命令时的简单性吗?或者说Bash的语法(没有二维数组,花括号/括号的复杂性)是跳到Python的理由吗?

3 个回答

3

这其实要看你想做什么,但我可以给你一些大致的区别。

像bash这样的命令行工具,通常把所有的变量当作字符串来处理,通过简单的文本替换来获取变量的值。有时候这样很方便,但有时候就不太好用了。

在命令行脚本中,你通常会通过把数据传递给各种工具来处理数据。有时候这样很方便,但有时候也会觉得麻烦。

Python在处理字符串方面非常强大,所以如果你需要处理很多文本文件,使用Python会更快(无论是写代码还是运行代码),而不是去琢磨该用什么sed或awk的命令。

还有一点,很多你在命令行脚本中使用的工具有很多选项,几乎可以算是小型语言,有些选项简直让人摸不着头脑。而Python的语法更一致,读起来也更容易理解,相比于那些调用了很多小型语言的命令行脚本,Python的可读性要好得多。

有些项目更适合用面向对象的方法来做,而Python对此支持得很好,而bash就不太行了。Python还支持一些函数式编程的方法,这对某些项目很有帮助,而bash...你懂的。

总的来说,命令行的脚本语言主要是用来把各种单功能的工具连接在一起,虽然有一些方便的功能,但Python则是一个强大的编程语言,你可以用它来构建完整的图形界面或网页应用。

我个人觉得Python的整体语法比命令行脚本语言要好得多;我的程序通常能按我想要的方式运行,不需要太多调整,而当它们不工作时,通常是逻辑错误,而不是因为我没能把想法转化成代码。对我来说,Python在这方面几乎是独一无二的,虽然我听说Ruby程序员也对他们喜欢的语言有类似的看法。

如果你熟悉并喜欢命令行脚本,Perl可能是一个更容易上手的选择,因为它最初就是为了替代命令行脚本(以及sed/awk)而设计的。

3

Bash在与系统直接交互时非常好用,因为它很容易运行外部程序,并且适合处理流式数据。而Python则更擅长处理复杂的逻辑、循环和数据结构等,适合做一些更深入的工作。可以说,各有各的用处。

要给你建议用哪个,或者怎么同时使用这两者,其实很难,因为我不知道你具体遇到的问题。不过听起来,这个任务我会完全用shell脚本来完成。我会找一种不使用数组的方法;关键是要停止用C++的思维,开始用bash的思维来考虑问题。

7

如果你找不到换工具的理由,那可能就真的没有理由去换。

我开始用Python是因为我有一些脚本需要处理模板,这在其他语言中比在shell脚本里简单得多。

还有一些脚本需要解析配置文件或者参数,这让我学了更多关于Python的知识,最后还有一些处理trac(用Python写的)的脚本也让我决定转向Python。

但是如果你能快速而干净地用bash写出你的脚本,而且不需要其他工具,那就继续用bash吧,它是个很棒的工具。

撰写回答