我尝试了几次学习shell(bash)脚本的过程,但是却被语法所取代。然后,我找到了Python,并且能够完成Shell脚本可以在Python中完成的大部分工作。我现在不确定是否应该再花时间在学习shell脚本上了。所以我想问:
与Python相比,shell脚本有哪些优势使其成为必不可少的工具?
我不是专业的系统管理人员,但是我对为家庭用户设置Linux系统感兴趣,因此我认为学习Shell脚本可能变得必要。
我尝试了几次学习shell(bash)脚本的过程,但是却被语法所取代。然后,我找到了Python,并且能够完成Shell脚本可以在Python中完成的大部分工作。我现在不确定是否应该再花时间在学习shell脚本上了。所以我想问:
与Python相比,shell脚本有哪些优势使其成为必不可少的工具?
我不是专业的系统管理人员,但是我对为家庭用户设置Linux系统感兴趣,因此我认为学习Shell脚本可能变得必要。
Answers:
“的确,您可以在Python中完成所有可以在Shell中完成的工作;同样,在Python中有些容易实现的事情在外壳中很难实现(就像有些东西在Shell中实现容易但在Python中很难实现一样)。从长远来看,了解两者将是最好的。
bash
并不是所有Linux发行版(特别是嵌入式系统的那些发行版,以及其他运行busybox
可执行文件的发行版)都不能普遍使用该外壳程序。面向Bourne shell本身的脚本bash
(向后兼容)将在所有POSIX兼容的系统上运行,但是该语言比所实现的语言受限制得多bash
。
“与Python相比,shell脚本有什么优势使其成为必不可少的工具?”
外壳不是必不可少的。您为什么认为有这么多?bash,tcsh,csh,sh等,等等,
Python 是一个外壳。这不是理想的运行脚本,而不是用于运行所有命令的脚本。
Python是所有Linux发行版中的或多或少的标准部分。
更传统的外壳会做很多事情。
他们有一个方便的用户界面来运行命令。这包括单行命令,shell在其中搜索您的PATH,派生并执行所请求的程序。它还包括管道,序列和并发程序(使用;
,|
和&
),以及一些重定向(使用>
和<
)。
它们具有运行脚本的简陋的类似于编程语言的功能。这种语言很难使用,效率极低。这种语言的大多数语句都需要分叉一个或多个其他过程,从而浪费时间和内存。
从shell运行程序,将stderr重定向到日志文件,这样的事情就很好了。在外壳中执行该操作。
作为Python脚本,几乎所有其他内容都可以更高效,更清晰地完成。
你们两个都需要。但是,永远不要使用传统的外壳语言编写带有if语句或循环的脚本。
if
语句通常涉及运行test
程序。在所有方面,shell是一种糟糕的编程语言。
bash
至少是)具有内建函数来处理决策(例如test
,bash
内建函数,以及更多通用的构造)。它当然有其弱点,也有其优点。还值得详细学习,因为它是与其他类型的语言截然不同的范例。
cat "$1" | ssh "$2" "cat - >\"$1\""
生了scp
。他们知道如何最好地设计它,因为他们已经在使用它。
Shell使普通和简单的动作真正简单了,但代价是使更复杂的事情变得更加复杂。
通常,一个小的Shell脚本会比相应的python程序更短,更简单,但是python程序会趋于优雅地接受修改,而随着代码的添加,shell脚本的可维护性会越来越少。
这样的结果是,为了获得最佳的日常生产力,您需要shell脚本,但是您应该主要将其用于一次性脚本,并在其他地方使用python。
Shell脚本无可比拟,而Python则无能为力。Shell脚本的最大优点是,您使用的命令与使用Shell时使用的命令相同,因此,如果您是大量Shell用户,则Shell脚本有时会成为一种非常快速简便的方法来自动执行Shell工作。
我也发现在shell脚本中处理数据管道比在python中更容易,尽管它在python中绝对可行。
最后,您不必启动其他干扰程序即可运行Shell脚本,从而为您提供了非常小但有时可能在速度和内存使用方面的明显优势。
但是话又说回来,Python脚本更具可维护性,因此我正试图从大型的难看的Shell脚本迁移到Python脚本。使用Python进行异常处理和质量检查也更加容易。