我刚刚结束了作为大学CS学生的第二年,所以缺乏“真实世界”的知识。我在第一年学习了Java,继续使用Java并选择了C和简单的Bash 我的第二个脚本。今年夏天,我正在努力学习Perl(上帝帮助我)。我过去曾经涉足过Python。
我的问题是,现在我们拥有非常易读,非常可写的脚本语言,如Python,Ruby,Perl等,为什么有人编写Bash脚本?有什么我想念的吗?我知道我的linux盒子有perl和python。它们不是无处不在吗?真的有点东西吗? 在Bash中比在其他地方更容易做什么?
答案 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脚本允许您使用相同语言 自动执行命令行任务,如果您手动输入命令,则可以使用相同语言。
#!/bin/sh
echo $PATH
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 ^(插入符号)作为替换| (管)。
答案 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}}应该适用于所有环境。