Bash脚本有什么用了吗?[关闭]


72

我刚刚完成第二年的大学CS学习,所以我缺乏对“现实世界”的了解。我第一年学习Java,然后继续学习Java,第二年学习了C和简单的Bash脚本。今年夏天,我正在尝试学习Perl(上帝帮助我)。我过去有点涉猎Python。

我的问题是,既然我们拥有易读,可写的脚本语言,例如Python,Ruby,Perl等,为什么有人编写Bash脚本?有什么我想念的吗?我知道我的linux机器有perl和python。它们不够普及吗?在Bash中确实有比在其他hll中更容易做的事情吗?


15
一环统治所有人,一环寻找他们,一环带来所有人,在黑暗中束缚他们-托尔金
mouviciel 2010年

11
“神救救我”?那是怎么回事?Perl并不难掌握!
扎伊德2010年

我无话可说。但是Bash脚本/ still /击败了Powershell供我使用。
保罗·内森

12
当您谈论可读性时,不确定是否将Perl与Python / Ruby一起使用...
BlueRaja-Danny Pflughoeft 2010年

6
@ BlueRaja,Perl是“非常可写”的语言(;
Daniel Harms 2010年

Answers:


59

除其他事项外,当您正在执行的大部分工作是在各种程序之间进行通信和管道传输(其中许多也是标准程序)时,bash很有用。在许多环境中,bash(或至少是POSIX shell)可用,而Perl和Python没有。

当然,您应该区分交互式bash和脚本化bash。Ubuntu最近将默认的脚本化shell(#!/bin/sh)改为dash,因为它的速度要快得多。但是,bash具有有用的交互功能,而dash没有(zsh更好,恕我直言)。


谢谢您提出的相关问题;很有用。
Daniel Harms 2010年

3
有点麻烦:Python现在几乎随同Linux发行版一起提供,也随Mac OS X一起提供。对于Windows,我想安装bash并不比安装Python容易……
Eric O Lebigot

如果要在Windows中使用Bash的本机版本,请学习Powershell环境。时也很有用“大多数的你正在做的是沟通和管道是什么”,虽然它是PowerShell的“cmdlet的”之间,而不是古老的标准Unix程序一样的awksed的grep的XPath的,等等
布兰登·阿诺德

截至2018年,Ubuntu的默认shell是BASH。这个答案有点过时了
Kolob Canyon'Apr 30'18

Bash就像Linux的家庭编程语言一样。
MaXi32 '20

36

Bash在系统管理,Web应用程序部署,数据处理,自动备份甚至日常管理中非常有用,仅举几例。我认为现在判断BASH这样的“资深IT士兵”还为时过早。

编辑谷歌搜索:

我还要提及的是,成功的OS-X程序TextMate内置了许多Bash机械。


您能给我一些更具体的例子吗?甚至只有一个?我不是在“判断” Bash,而是尝试了解人们真正使用它的目的。
丹尼尔·哈姆斯

对我的口气感到抱歉,但我真正的意思不是说您对Bash的评价不好,只是我不认为现在是时候将其评判为“准备退休”了。:)
microspino 2010年

这些是Python肯定可以做的,而且比bash更方便……
Eric O Lebigot 2010年

1
@EOL尽管我同意您的意见,并在许多任务中使用python或ruby,但仍然有些地方您只能得到bash:我认为是嵌入式世界。尽管它每天都在改进,但是很难在嵌入式设备中找到高级解释语言,并且可以通过bash或ash管理它们。
microspino 2010年

@mircospino:有关嵌入式设备的有趣信息!
埃里克·勒比格

26

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

列出$ PATH的简单示例

重击

#!/bin/sh
echo $PATH

蟒蛇

import os
print os.getenv("path")

2
因此,使用bash是因为您不必将环境变量放在引号中...?
BlueRaja-Danny Pflughoeft

8
我的观点是,在脚本模式和交互模式下使用了相同的语言。(用于bash)
mikek3332002 2010年

这是不一样的语言。许多命令不同于Linux和Mac。
Iulian Onofrei

2
不要假设/ bin / sh总是与/ bin / bash链接。
Nikole

很好,@ Mangostaniko
mikek3332002 '17

25

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

尽管Python可以运行相同的程序,但您将被迫在python脚本中执行bash脚本以完成相同的任务,然后又陷入了python和bash的困境。两者本身都很好,但是混合使用并不能改善恕我直言。


15

对于很多任务,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

11

我认为,对于许多任务而言,python不如bash那样自然是一个很强的论点,这是一个简单的事实,没有人将python解释器用作其shell。显然这是可能的:

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

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


另一方面,Perl外壳确实存在,请参见Zoidberg search.cpan.org/~pardus/Zoidberg-0.94/lib/Zoidberg.pm
Joel Berger 2010年

即使该示例也不起作用,因为“〜”是shell扩展变量。
dramzy

@dramzy好点。我添加了一个os.path.expanduser电话。完整的pythonic版本会更糟:os.path.join(os.path.expanduser("~"),"dev")。而且,即使您真的想从python中运行vim,也不要考虑IO重定向将如何工作。我认为我的观点很明确。
Quantum17年

7

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


4

传统上,许多启动脚本都是作为Shell脚本编写的,似乎没有任何趋势可以摆脱它们。

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

除此之外:即使像Perl,Python和Ruby之类的语言变得越来越普遍,在每个类unix的系统上实际上可以保证的唯一语言是bourne shell(尽管不一定采用bash的形式)。


4

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

其他脚本语言肯定有用,也许功能更强大,但是当您面对终端时,您将要处理的是……Bash。

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


3

Bash不仅是一种脚本语言,而且是一种外壳程序。

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

作业控制的自动化已发展出一大类脚本语言,这涉及启动和控制系统程序的行为。(从这个意义上讲,人们可能会把shell看作是IBM JCL或Job Control Language的后代,正是这种语言正是出于此目的而使用的。)这些语言的许多解释器兼用作命令行解释器,例如Unix shell或MS-DOS COMMAND.COM。其他脚本(例如AppleScript)提供了类似英语的命令来构建脚本。结合Mac OS X的Cocoa框架,用户可以使用AppleScript&Cocoa对象构建整个应用程序。

Python,Ruby和Perl很棒,但是更通用。在某些情况下(嵌入式设备或其他简约系统),它们可能会显得过大,或者在其他情况下,它们可能会带来安全风险(对于您想要非常高的安全性并尝试消除任何不必要的程序包的环境)。

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

而且,bash已通过生产验证,可用于多种管理任务,并且很容易找到可以覆盖非常复杂的场景(异常)并优雅地处理它们的脚本。


2

比较容易,也许不是。在许多情况下,我实际上更喜欢perl而不是bash脚本。但是,Bash确实具有一个优势,尤其是在Linux系统上:Bash几乎可以保证已安装。如果不是这样,它的很大程度上兼容的父亲(sh)将成为原因,因为几乎所有系统脚本都是为sh编写的。甚至perl也不是无处不在,它无处不在。


2

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

它可能不是表达您的任务的最佳语言,并不意味着它已经死了,垂死甚至垂死。


2

如果您做大量的GUI事情,那么每当您在自己的计算机上进行某种自定义时,您可能只会遇到bash。各种技巧和东西。如果使用命令行执行任务,bash就是必不可少的。实际上,要在命令行上表现出色,需要bash或其他一些shell熟悉知识。

当我想快速浏览硬盘时,我从学习Bash中学到了很多东西。我编写了一个导航/菜单界面,使我可以快速轻松地浏览到不同的文件夹和文件。用bash编写它很容易。并且有许多易于访问且免费的内容将向您展示如何操作。

另外,学习Bash对于了解Unix和某些核心内容的真正工作原理以及我们对Python之类工具的了解也非常有用。


2

我是一个perl专家,但是我每天使用和创建的bash(或ksh)函数的数量非常重要。对于涉及的所有内容,我将编写一个perl脚本,但是对于导航目录结构,以及专门用于处理环境变量bash / ksh / ...来说,必不可少。

同样,特别是对于环境变量,没有什么比外壳程序更胜一筹了,并且很多程序都使用环境变量。在Perl中,我必须编写一个bash别名或函数来调用Perl脚本,该脚本会写出一个临时bash脚本,然后在Perl退出后获取该bash脚本以在与我启动时相同的环境中进行更改。

我已经做到了,尤其是对于繁琐的路径变量。但是没有办法Perl(或python或ruby ...或C代码)中做到这一点。


对我来说,操作env vars似乎是一个星期的例子。当然,您可以从perl或任何其他工具中访问操纵env var。您只是无法将它们导出回bash。这是变量在每个子shell中封装方式的限制,而不是任何特定语言的限制。
Quantum7年

@ Quantum7,我没有得到“弱示例”。我不考虑将修改后的env变量传递给“操纵环境变量”的子流程,因此我并不是在谈论那个。我看不出其余的情况如何。我从未说过这是语言问题-显然是环境水平问题。Shell是一个环境-Perl本身不是。
Axeman 2010年

1

您可能会在新鲜肉上获得真正的出价(例如,在Mac OS X上,/ bin / sh不是真正的出价)。

如何识别传统的伯恩贝壳?...对一个经常未记录但具有特征的特征进行简单检查:您可以使用circumflex ^(插入符号)代替|。(管)。

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


1

以我的经验,Perl满足了可能需要Shell脚本的99%的需求。另外,可以编写在Windows上不运行Cygwin的代码。如果我要定位的Windows框上没有安装Perl,则可以使用PAR :: Packer或PerlApp生成可执行文件。Python,Ruby和其他工具也应同样工作。

但是,shell脚本并不那么复杂-至少您应该在shell中编写脚本的事情并不那么复杂。您可以用相当浅的知识来完成所需的工作。

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

最重要的是,学习阅读Shell手册页。这听起来可能很有趣,但是我100%认真-不用担心将Shell脚本的每个细节塞入大脑,而是学会快速,有效地在手册页中找到需要了解的内容。如果您发现自己经常使用Shell脚本,则相关信息自然会留在您的大脑中。

因此,是的,基本外壳程序值得学习。


1

如前所述,GNU工具很棒,并且在Shell中最容易使用。如果您的数据已经是纯文本的线性或表格形式,那就特别好。举个例子,有一天,我能够构建一个脚本来在Bourne Shell的8行中创建任何文本文件的XHTML文字云,它甚至比Bash强大(但得到更广泛的支持)。


1

我不明白的是为什么人们bash在说任何bourne-shell兼容的外壳时都会说。

编写shell脚本时:始终尝试使用在较旧的bourne shell解释器中也可以使用的构造。有一天,它将为您节省很多麻烦。

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

在大多数情况下,我会说普通的bourne shell同样有效。

典型的陷阱: if ! test $x -eq $y在具有更聪明的内置“ if”运算符的bash中按预期方式工作,但“正确”if test ! $x -eq $y应在所有环境中均有效。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.