Bash脚本还有用吗?

时间:2010-05-20 08:20:11

标签: python perl bash scripting comparison

我刚刚结束了作为大学CS学生的第二年,所以缺乏“真实世界”的知识。我在第一年学习了Java,继续使用Java并选择了C和简单的Bash 我的第二个脚本。今年夏天,我正在努力学习Perl(上帝帮助我)。我过去曾经涉足过Python。

我的问题是,现在我们拥有非常易读,非常可写的脚本语言,如Python,Ruby,Perl等,为什么有人编写Bash脚本?有什么我想念的吗?我知道我的linux盒子有perl和python。它们不是无处不在吗?真的有点东西吗? 在Bash中比在其他地方更容易做什么?

18 个答案:

答案 0 :(得分:55)

除此之外,当您正在进行的大多数在各种程序之间进行通信和管道(其中许多也是标准的)时,bash非常有用。有许多环境可以使用bash(或者至少有POSIX shell),但Perl和Python不可用。

当然,你应该区分交互式bash和脚本bash。 Ubuntu最近将其默认脚本shell(#!/bin/sh)切换为dash,因为它更快。但是,bash具有有用的互动功能,而破折号却没有(zsh仍然更好,恕我直言)。

答案 1 :(得分:32)

Bash在系统管理,Web应用程序部署,数据处理,sutomated备份,甚至getting-things-done day by day management中都非常有用,仅举几例。我认为现在判断像BASH这样的“资深IT士兵”还为时过早。

编辑谷歌搜索:

我还要提到TextMate一个成功的OS-X程序里面有很多Bash机制。

答案 2 :(得分:23)

bash和python之间的真正区别在于python是一种通用的脚本语言,而bash只是一种在一系列中运行无数小(通常非常快)的程序的方法。 Python可以做到这一点,但它没有针对它进行优化。程序(sort,find,uniq,scp)可以非常简单地执行非常复杂的任务,而bash允许这些任务非常简单地与管道互操作,从文件或设备中刷新输出和输出等。

Python可以运行相同的程序,你将被迫在python脚本中执行bash脚本来完成同样的事情,然后你就陷入了python和bash。两者都很好,他们自己,但这些混合不会改善任何东西恕我直言。

答案 3 :(得分:22)

Bash脚本允许您使用相同语言 自动执行命令行任务,如果您手动输入命令,则可以使用相同语言

列出$ PATH

的简单示例

#!/bin/sh
echo $PATH

的Python

import os
print os.getenv("path")

答案 4 :(得分:14)

对于很多任务,bash可以非常简洁。 用于在当前目录的所有文件中搜索字符串并打印这些行的代码:

在bash中:

grep -ir "search_term" .

在Python中:

for file in os.listdir('.'):
  file_content = open(file).readlines().split('\n')
  for line in file_content:
    if line.count("search_term") > 0:
      print file, ": ", line

答案 5 :(得分:9)

我认为,对于许多任务而言,python并不像bash那样自然,这是一个简单的事实,即没有人使用python解释器作为它们的shell。显然这是可能的:

python> import os, subprocess
python> os.chdir(os.path.expanduser("~/work"))
python> subprocess.call(["vim","README"])

显然使用python作为shell是荒谬的。 Bash专为运行其他程序而设计。 Python是为进行计算而设计的。虽然大多数事情都可以用任何一种语言完成,但总是可以在bash中比在python中更容易完成任务,反之亦然。

答案 6 :(得分:6)

好吧,使用bash编写时,您可以直接在命令行中使用每个可能的工具来编写脚本。使用任何其他语言,您首先必须执行该命令并获得一些结果等。一个简单的脚本(例如)获取进程列表,通过grep运行并获得一些结果将在其他语言中复杂得多。因此,bash仍然是编写快速内容的好工具。

答案 7 :(得分:4)

除了别人所说的,我想指出我认为学习Bash的主要原因是什么:它是(几乎)标准的Linux shell

其他脚本语言肯定是有用的,也许功能更强大,但当你面前有一个终端时,你要处理的是...... Bash。

如果您想管理Linux系统,能够管理I / O,管道和进程,分配和使用变量,以及至少进行一些循环和条件评估是必须的。

答案 8 :(得分:4)

许多启动脚本传统上都是作为shell脚本编写的,并且似乎没有偏离这些脚本的趋势。

Shell脚本非常适合启动其他进程并将其输入/输出粘合在一起。这是其他脚本语言不那么强大的领域。

除此之外:即使像Perl,Python和Ruby这样的语言变得越来越普遍,在每个类似unix的系统上,实际上保证的唯一语言是{{3} ('虽然不一定是bourne shell的形式)。

答案 9 :(得分:3)

Bash不仅是一种脚本语言,而且是一种shell。

  

<强> Job control languages and shells
  主要文章:Shell脚本

     

一类主要的脚本语言   已经成长为工作的自动化   控制,涉及开始和   控制系统的行为   程式。 (从这个意义上说,有人可能   认为贝壳是后代   IBM的JCL或作业控制语言,   这正是用于此   目的。)许多这些语言'   解释器兼作命令行   解释器,如Unix shell或   MS-DOS COMMAND.COM。其他如此   正如AppleScript提供的那样   建立类似英语的命令   脚本。这与Mac OS X相结合   Cocoa框架允许用户构建   使用AppleScript的整个应用程序   &安培;可可物。

Python,Ruby和Perl很棒,但是更通用的工具;在某些情况下(嵌入式设备或其他简约系统),它们可能会被视为膨胀,或者在其他情况下,它们可能会带来安全风险(对于您需要非常高安全性的环境并尝试消除任何不必要的软件包)。

在某些情况下,由于与操作系统的紧密集成,shell脚本的性能会更好。

此外,bash已经过多次管理任务的生产证明,很容易找到可以覆盖非常复杂的场景(例外)的脚本并优雅地处理它们。

答案 10 :(得分:2)

更容易,可能不是。在很多情况下,我实际上更喜欢使用perl来编写脚本。 Bash确实有一个优势,特别是在Linux系统上:它几乎都可以保证安装。如果不是,那么它的大部分兼容的父(sh)将是,因为几乎所有系统脚本都是为sh编写的。即使是perl也不是那么普遍存在,而且每一次都是疯狂的。

答案 11 :(得分:2)

如果你做了很多GUI工作,那么只要你在自己的机器上进行某种自定义,你就可能只遇到bash。各种黑客和东西。如果你使用命令行来做东西,bash是必不可少的。事实上,在命令行上做得好,需要bash或其他一些shell熟悉。

当我想快速浏览我的硬盘时,我已经学会了Bash。我写了一个导航/菜单界面,让我可以快速轻松地发送到不同的文件夹和文件。用bash编写它简单易行。还有很多易于访问和免费的东西可以告诉你如何。

另外,学习Bash非常适合理解Unix和一些核心内容是如何工作的 - 以及我们使用Python等工具的程度。

答案 12 :(得分:1)

Bash(以及最初的Bourne sh和无数衍生品) - 从一个角度来看 - 是一种令人难以置信的高级语言。在许多语言使用简单原语的情况下,shell原语是整个程序。

它可能不是表达你的任务的最佳语言,并不意味着它已经死亡,死亡,甚至奄奄一息。

答案 13 :(得分:1)

你可能会在freshmeat上获得真正的灼热感(例如,在Mac OS X上,/ bin / sh不是真正的bourssh)。

  

如何识别传统的Bourne shell? ...对一个通常没有记录但具有特征的特征进行简单检查:您可以使用circumflex ^(插入符号)作为替换| (管)。

请参阅:http://www.in-ulm.de/~mascheck/bourne/

答案 14 :(得分:1)

根据我的经验,Perl可以满足任何可能需要shell脚本的99%的需求。作为奖励,可以编写在Windows上运行Cygwin的代码。如果我不想在我想要定位的Windows机器上安装Perl,我可以使用PAR :: Packer或PerlApp来生成可执行文件。 Python,Ruby和其他人也应该也能正常工作。

但是,shell脚本并不是那么复杂 - 至少你应该在shell中编写脚本的东西并不是那么复杂。你可以用相当浅层次的知识做你需要做的事。

了解如何阅读和设置变量。如何创建和调用函数。如何获取其他文件。了解流量控制的工作原理。

最重要的是,学习阅读shell手册页。这可能听起来很滑稽,但我百分之百严肃 - 不要担心将shell脚本的每个细节塞进你的大脑,而是学会快速有效地在手册页中找到你需要知道的东西。如果您发现自己经常使用shell脚本,相关信息将自然地粘在您的大脑中。

所以,是的,基本shell值得学习。

答案 15 :(得分:1)

我是一个perl家伙,但是我每天使用和创建的bash(或ksh)函数的数量非常重要。对于任何涉及的内容,我将编写一个perl脚本,但是为了导航目录结构,特别是操作环境变量 bash / ksh / ...是必不可少的。

同样,特别是对于环境变量,没有什么比shell好,而且很多程序都使用环境变量。在Perl中,我必须编写一个调用Perl脚本的bash别名或函数,该脚本写出一个临时bash脚本,然后在Perl退出后获取源代码,以便在我正在启动的相同环境中进行更改。

我已经完成了这项工作,特别是对于路径变量的繁重工作。但是在只是Perl (或python或ruby ......或者C代码)中没有办法做到这一点。

答案 16 :(得分:1)

如上所述,GNU工具很棒,并且最容易在shell中使用。如果您的数据已经是纯文本的线性或表格形式,那就特别好了。就像一个例子,前几天我能够构建一个脚本,在Bourne Shell的 8 行中创建任何文本文件的XHTML词云,这个功能甚至更低(但支持得更广泛)比巴什。

答案 17 :(得分:1)

我不知道的是为什么人们在bash表示任何bourne-shell兼容的shell时会说if ! test $x -eq $y

编写shell脚本时:始终尝试使用也适用于较旧的bourne shell解释器的构造。它有一天会给你带来很多麻烦。

是的,今天shell脚本有很多用处,因为shell总是存在于所有unix上,开箱即用,与perl,python,csh,zsh,ksh(可能?)相反,等等。 大多数情况下,它们只为循环和测试等构造添加额外的便利或不同的语法。有些人改进了重定向功能。

大多数时候,我会说普通的Bourne shell同样运作良好。

典型的陷阱: if test ! $x -eq $y在bash中按预期工作,它具有更聪明的内置“if”运算符,但“正确”{{1}}应该适用于所有环境。