提问人:Daniel Harms 提问时间:5/20/2010 最后编辑:dreftymacDaniel Harms 更新时间:11/10/2023 访问量:53302
Bash 脚本还有用吗?[已结束]
Is there any use for Bash scripting anymore? [closed]
问:
我刚刚完成了大学计算机科学专业的第二年,所以我缺乏“现实世界”的知识。我第一年学习了 Java,继续学习 Java,并学习了 C 和简单的 Bash 编写我的第二个脚本。今年夏天,我正在尝试学习Perl(上帝保佑我)。我过去曾涉足过 Python。
我的问题是,既然我们有了非常可读、非常可写的脚本语言,如 Python、Ruby、Perl 等,为什么有人编写 Bash 脚本?我错过了什么吗?我知道我的 linux 盒子有 perl 和 python。它们还不够普遍吗?真的有什么东西吗 这在 Bash 中比其他一些 hll 更容易做到?
答:
除其他外,当您所做的大部分工作是在各种程序(其中许多也是标准程序)之间进行通信和管道传输时,bash 非常有用。在许多环境中,bash(或至少是 POSIX shell)可用,但 Perl 和 Python 没有。
当然,您应该区分交互式 bash 和脚本化 bash。Ubuntu 最近将他们的默认脚本 shell () 切换为 dash,因为它要快得多。但是,bash 具有有用的交互功能,而 dash 没有(zsh 仍然更好,恕我直言)。#!/bin/sh
评论
Bash 在系统管理、Web 应用程序部署、数据处理、自动备份,甚至日常管理方面都非常有用,仅举几例。我认为现在评判像 BASH 这样的“资深 IT 士兵”还为时过早。
编辑谷歌搜索:
我还想提一下,TextMate,一个成功的 OS-X 程序,里面有很多 Bash 机制。
评论
好吧,在使用 bash 编写脚本时,您可以直接使用命令行上的所有可能工具来编写脚本。对于任何其他语言,您首先必须执行该命令并获得一些结果等。一个简单的脚本(例如)获取进程列表,通过 grep 运行并获得一些结果,在其他语言中会复杂得多。因此,bash 仍然是编写快速内容的好工具。
许多启动脚本传统上都是作为 shell 脚本编写的,并且似乎没有摆脱这些脚本的趋势。
Shell 脚本非常适合启动其他进程并将其输入/输出粘合在一起。这是其他脚本语言不那么强大的领域。
除此之外:即使像Perl,Python和Ruby这样的语言变得越来越普遍,在每个类Unix系统上,你几乎可以保证的唯一语言是bourne shell(尽管不一定是bash的形式)。
更容易,可能不是。在许多情况下,我实际上更喜欢 perl 而不是 bash 脚本。不过,Bash 确实有一个优势,尤其是在 Linux 系统上:它几乎可以保证安装。如果不是,它的父 (sh) 将是,因为几乎所有的系统脚本都是为 sh 编写的。甚至 perl 也不是那么普遍,而且无处不在。
从某种角度来看,Bash(以及最初的 Bourne sh 和无数衍生物)是一种令人难以置信的高级语言。许多语言使用简单的基元,而 shell 基元是整个程序。
它可能不是表达你的任务的最佳语言,并不意味着它已经死了,垂死了,甚至垂死了。
Bash 脚本允许您使用与手动键入命令相同的语言来自动执行命令行任务。
列出$PATH的简单示例
重击
#!/bin/sh
echo $PATH
蟒蛇2
import os
print os.getenv("path")
评论
bash 和 python 之间的真正区别在于,python 是一种通用的脚本语言,而 bash 只是一种在系列中运行无数小型(通常非常快)程序的方法。Python 可以做到这一点,但它没有针对它进行优化。程序(sort、find、uniq、scp)可以非常简单地执行非常复杂的任务,而 bash 允许这些任务非常简单地与管道、从文件或设备中刷新输出等进行互操作。
虽然 Python 可以运行相同的程序,但您将被迫在 python 脚本中执行 bash 脚本来完成相同的操作,然后您将同时使用 python 和 bash。两者本身都很好,但恕我直言,这些的混合并不能改善任何事情。
Bash 不仅是一种脚本语言,而且是一个 shell。
作业控制语言和 shell
主条目:Shell 脚本一类主要的脚本语言 已经从自动化的工作中成长起来 控制,这与启动和 控制系统的行为 程序。(从这个意义上说,人们可能会 把贝壳看作是后代 IBM 的 JCL 或作业控制语言, 正是用于此目的的 目的。这些语言中的许多语言' 解释器兼作命令行 解释器,例如 Unix shell 或 MS-DOS COMMAND.COM。其他,如 由于 AppleScript 提供了使用 类似英语的命令来构建 脚本。这与 Mac OS X 的 Cocoa 框架允许用户构建 使用 AppleScript 的整个应用程序 &可可对象。
Python、Ruby 和 Perl 很棒,但更通用;在某些情况下(嵌入式设备或其他简约系统),它们可能被认为是膨胀的,或者在其他情况下,它们可能会带来安全风险(对于您希望非常高的安全性并尝试消除任何不必要的包的环境)。
在某些情况下,由于与操作系统的集成更紧密,shell 脚本的性能会更好。
此外,bash 在生产环境中经过了无数管理任务的验证,并且很容易找到能够涵盖非常复杂的场景(异常)并优雅地处理它们的脚本。
如果你做了很多 GUI 的东西,你可能只会在你自己的机器上做某种定制时遇到 bash。各种黑客和东西。如果你使用命令行来做一些事情,bash是必不可少的。事实上,要想在命令行上表现出色,就需要熟悉 bash 或其他一些 shell。
当我想快速浏览我的硬盘时,我从学习 Bash 中得到了很多好处。我编写了一个导航/菜单界面,让我可以快速轻松地连接到不同的文件夹和文件。用 bash 编写它既简单又容易。还有很多易于访问且免费的东西可以向您展示如何操作。
此外,学习 Bash 对于理解 Unix 和一些核心内容是如何工作的非常有用——以及我们在使用 Python 等工具方面取得了多大的进展。
您可能会在 freshmeat 上得到真正的 bournesh(例如,在 Mac OS X 上,/bin/sh 不是真正的 bournesh)。
如何识别传统的伯恩贝壳?...对一个通常没有记录但有特征的特征进行简单检查:您可以使用 circumflex ^(插入符号)作为 |(管道)。
请参见:http://www.in-ulm.de/~mascheck/bourne/
除了其他人所说的之外,我还想指出我认为学习 Bash 的主要原因:它是(几乎)标准的 Linux shell。
其他脚本语言肯定是有用的,也许更强大,但是当你面前有一个终端时,你要处理的是......猛烈抨击。
如果你想管理一个Linux系统,那么能够管理I/O、管道和进程、评估和使用变量,以及至少做一些循环和条件评估是必须的。
根据我的经验,Perl 满足了大约 99% 可能需要 shell 脚本的需求。作为奖励,可以编写在没有 Cygwin 的 Windows 上运行的代码。如果我不想在我想要定位的 Windows 机器上安装 Perl,我可以使用 PAR::P acker 或 PerlApp 来生成可执行文件。Python、Ruby 和其他软件也应该同样有效。
但是,shell 脚本并不是那么复杂——至少您应该在 shell 中编写脚本的事情并不那么复杂。你可以用相当浅的知识水平做你需要做的事情。
了解如何读取和设置变量。如何创建和调用函数。如何获取其他文件。了解流量控制的工作原理。
最重要的是,学会阅读 shell 手册页。这听起来可能很有面子,但我是 100% 认真的——不要担心把 shell 脚本的每一个细节都塞进你的大脑,而是学会快速有效地在手册页中找到你需要知道的内容。如果您发现自己经常使用 shell 脚本,那么相关信息自然会留在您的大脑中。
所以,是的,基本的外壳是值得学习的。
我是一个 perl 人,但我每天使用和创建的 bash(或 ksh)函数的数量非常可观。对于涉及的任何内容,我将编写一个 perl 脚本,但用于导航目录结构,特别是用于操作环境变量 bash/ksh/...是不可或缺的。
同样,特别是对于环境变量,没有什么比 shell 更好的了,而且相当多的程序使用环境变量。在 Perl 中,我必须编写一个调用 Perl 脚本的 bash 别名或函数,该脚本会写出一个临时的 bash 脚本,然后在 Perl 退出后获取该脚本,以便在我启动的同一环境中进行更改。
我已经这样做了,特别是对于路径变量的繁重工作。但是没有办法只在Perl(或python或ruby)中做到这一点。或 C 代码)。
评论
对于很多任务,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
评论
如前所述,GNU 工具很棒,并且最容易在 shell 中使用。如果您的数据已经是纯文本的线性或表格形式,那就特别好了。举个例子,前几天我能够构建一个脚本来创建 8 行 Bourne Shell 中任何文本文件的 XHTML 词云,它甚至不如 Bash 强大(但支持更广泛)。
我不明白的是,为什么人们会说他们指的是任何兼容的 shell。bash
bourne-shell
编写 shell 脚本时:始终尝试使用在较旧的 bourne shell 解释器中也有效的结构。总有一天它会为您省去很多麻烦。
是的,今天 shell 脚本有很多用途,因为 shell 总是存在于所有 unix 上,开箱即用,与 perl、python、csh、zsh、ksh(可能吗?)等相反。 大多数情况下,它们只会为循环和测试等构造增加额外的便利性或不同的语法。有些具有改进的重定向功能。
大多数时候,我会说普通的 bourne shell 同样有效。
典型的陷阱:在具有更聪明的内置“if”运算符的 bash 中按预期工作,但“正确”应该在所有环境中都有效。if ! test $x -eq $y
if test ! $x -eq $y
我认为,对于许多任务来说,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 中更容易完成,反之亦然。
评论
os.path.expanduser
os.path.join(os.path.expanduser("~"),"dev")
评论