是否有任何用于Bash脚本?

我刚刚完成大学二年级学生的第二年,所以缺乏“现实世界”的知识。 我第一年就学习了Java,继续使用Java,第二次学习了C语言和简单的Bash脚本。 今年夏天,我正在努力学习Perl(上帝帮助我)。 过去我已经涉猎了Python。

我的问题是,现在我们有非常可读的,非常可写的脚本语言,如Python,Ruby,Perl等,为什么有人写Bash脚本? 有什么我失踪? 我知道我的Linux机器有perl和python。 他们是不是无处不在? Bash中有没有比在其他一些地方更容易做到的事情?

除此之外,当你正在做的大部分事情是在各种程序(其中许多也是标准的)之间进行通信和pipe道时,bash是有用的。 有很多环境可以使用bash(或者至less一个POSIX shell ),但是Perl和Python不可以。

当然,你应该区分交互式bash和脚本bash。 Ubuntu最近把默认的脚本shell( #!/bin/sh )切换成了破折号,因为它更快。 但是, bash具有有用的交互function短跑不( zsh仍然更好,恕我直言)。

另请参见当我知道Perl时是否值得学习BASH?

Bash在系统pipe理,Web应用程序部署,数据处理,智能备份,甚至是日常pipe理等方面都是非常有用的,仅举几例。 我认为现在判断像BASH这样的“IT老兵”还为时过早。

编辑谷歌search:

  • 全面的好例子列表
  • 有用的bash提示和技巧
  • Web Devel有18个有用的脚本。
  • 两分钟bash编码来改善你的git使用

我还想提一下, TextMate成功的OS-X程序里面有很多Bash机器。

bash和python之间的真正区别在于,python是一种通用的脚本语言,而bash只是一系列运行一系列小型(通常非常快)的程序的一种方式。 Python可以做到这一点,但没有为它优化。 程序(sort,find,uniq,scp)可以非常简单地完成非常复杂的任务,bash允许这些任务与pipe道非常简单地交互操作,从文件或设备中清除输出。

虽然Python可以运行相同的程序,但您将被迫在python脚本中执行bash脚本来完成相同的任务,然后您将同时使用python和bash。 他们都很好,他们自己,但混合这些不会改善任何IMHO。

Bash脚本允许您通过使用手动input命令相同的语言自动执行命令行任务

列举$ PATH的简单示例

巴什

 #!/bin/sh echo $PATH 

python

 import os print os.getenv("path") 

对于很多任务来说,bash可以非常简洁。 在当前目录的所有文件中searchstring的代码并打印这些行:

在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 

我认为有一个强有力的论据,认为python不像许多任务那样自然bash是一个简单的事实,没有人使用python解释器作为shell。 显然这是可能的:

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

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

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

传统上,许多启动脚本都是作为shell脚本编写的,似乎没有一种趋势摆脱这些脚本。

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

除此之外,即使像Perl,Python和Ruby这样的语言变得越来越无处不在,在每个类Unix系统中实际上保证的唯一语言是bourne shell (虽然不一定是bash的forms)。

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

其他的脚本语言肯定是有用的,也许function更强大,但是当你在你面前有一个terminal的时候你会处理的是… Bash。

如果要pipe理Linux系统,能够pipe理I / O,pipe道和进程,分配和使用variables以及至less进行一些循环和条件评估是必须的。

更容易,可能不会。 我实际上更喜欢perl在许多情况下打脚本。 Bash确实有一个优势,尤其是在Linux系统上:它们都保证被安装。 如果不是,它的兼容性很强的父亲(sh)将会是,因为几乎所有的系统脚本都是为sh编写的。 即使perl也不是那种无处不在的,而且每个地方都是这样。

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

作业控制语言和shell
主要文章:Shell脚本

一类主要的脚本语言已经从作业控制的自动化发展而来,这涉及到启动和控制系统程序的行为。 (从这个意义上讲,人们可能会认为shell是IBM JCL的后代,或者说是Job Control Language,它就是用于这个目的的)。这些语言中的许多解释器都是命令行解释器,比如Unix shell或者MS-DOS COMMAND.COM。 其他的,如AppleScript提供了使用类似英语的命令来构build脚本。 这与Mac OS X的Cocoa框架相结合,允许用户使用AppleScript&Cocoa对象构build整个应用程序。

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

在某些情况下,由于与OS更紧密的集成,shell脚本将会performance得更好。

另外,bash经过无数的pipe理任务的生产validation,很容易find将涵盖非常复杂的情况(例外情况)的脚本并优雅地处理它们。

如果你做了很多的graphics用户界面的东西,你可能只会遇到bash,当你在自己的机器上做某种定制。 各种黑客和东西。 如果你使用命令行做东西,bash是不可或缺的。 事实上,在命令行上的良好需要bash或其他shell的熟悉。

当我想要快速浏览我的硬盘时,我学到了很多东西。 我写了一个导航/菜单界面,可以让我快速轻松地浏览不同的文件夹和文件。 用bash写它简单而容易。 还有很多很容易获取的,免费的东西,会告诉你如何。

另外,学习Bash对于理解Unix和一些核心工具是如何工作是非常有用的 – 我们用Python这样的工具还有多远。

Bash(以及原始的Bourne Sh和无数衍生品)从一个angular度来说是一种难以置信的高级语言。 在很多语言使用简单原语的地方,shell原语是整个程序。

它可能不是expression你的任务的最好的语言,并不意味着它已经死了,正在死亡,甚至是奄奄一息。

你可能会得到一个真正的新鲜肉类(在Mac OS X上,例如,/ bin / sh不是一个真正的bournesh)。

如何识别传统的Bourne shell? …一个简单的检查,通常没有logging但有特色的function:您可以使用音符^(插入符号)作为replace| (pipe)。

见: http : //www.in-ulm.de/~mascheck/bourne/

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

但是,shell脚本并不是那么复杂 – 至less你应该在shell中编写脚本的东西并不复杂。 你可以用相当浅的知识水平来做你所需要的。

学习如何读取和设置variables。 如何创build和调用函数。 如何获取其他文件。 了解stream量控制如何工作。

最重要的是,学习阅读shell手册页。 这可能听起来很滑稽,但我是100%认真的 – 不要担心把shell脚本的每一个细节都塞进你的大脑,而应该快速高效地find你需要知道的东西。 如果你经常发现自己使用shell脚本,那么相关的信息自然会粘在你的大脑中。

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

我是一个perl家伙,但是我每天使用和创build的bash(或ksh)函数的数量是相当重要的。 对于任何涉及到的东西,我会写一个perl脚本,但是为了浏览目录结构,特别是操作环境variables bash / ksh / …是不可或缺的。

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

我已经这样做了,特别是对于pathvariables的重负。 但是没有办法只用Perl (或python或ruby …或C代码)。

如前所述,GNU工具非常棒,在shell中最容易使用。 如果您的数据已经是纯文本的线性或表格forms,那就特别好。 就像一个例子,有一天,我能够构build一个脚本来创buildBourne Shell的8行任何文本文件的XHTML文字云,这比Bash更强大(但是更广泛的支持)。

我没有得到的是为什么人们说bash当他们的意思是任何bourne-shell兼容的shell。

编写shell脚本时: 总是尝试使用也适用于旧版bourne shell解释器的构造。 这会为你节省很多麻烦。

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

大多数时候,我会说普通的Bourne shell同样适用。

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