原标题:Bash shell 的诞生 | Linux 中国

本周的《代码英雄》播客深入研究了最广泛使用的、已经成为事实标准的脚本语言,它来自于自由软件基金会及其作者的早期灵感。

-- Matthew Broberg

对于任何从事于系统管理员方面的人来说,Shell 脚本编程是一门必不可少的技能,而如今人们编写脚本的主要 shell 是 Bash。Bash 是几乎所有的 Linux 发行版和现代 MacOS 版本的默认配置,也很快就会成为 的原生部分。你可以说 Bash 无处不在。

那么它是如何做到这一点的呢?本周的《》播客将通过询问编写那些代码的人来深入研究这个问题。

肇始于 Unix

像所有编程方面的东西一样,我们必须追溯到 Unix。shell 的简短历史是这样的:1971 年,Ken Thompson 发布了第一个 Unix shell:Thompson shell。但是,脚本用户所能做的存在严重限制,这意味着严重制约了自动化以及整个 IT 运营领域。

这个奇妙的研究概述了早期尝试脚本的挑战:

类似于它在 Multics 中的前身,这个 shell(/bin/sh)是一个在内核外执行的独立用户程序。诸如通配(参数扩展的模式匹配,例如 *.txt)之类的概念是在一个名为 glob 的单独的实用程序中实现的,就像用于计算条件表达式的 if 命令一样。这种分离使 shell 变得更小,才不到 900 行的 C 源代码。

shell 引入了紧凑的重定向( 和 >>)和管道(| 或 ^)语法,它们已经存在于现代 shell 中。你还可以找到对调用顺序命令(;)和异步命令(&)的支持。

Thompson shell 缺少的是编写脚本的能力。它的唯一目的是作为一个交互式 shell(命令解释器)来调用命令和查看结果。

随着对终端使用的增长,对自动化的兴趣随之增长。

Bourne shell 前进一步

在 Thompson 发布 shell 六年后,1977 年,Stephen Bourne 发布了 Bourne shell,旨在解决Thompson shell 中的脚本限制。(Chet Ramey 是自 1990 年以来 Bash 语言的主要维护者,在这一集的《代码英雄》中讨论了它)。作为 Unix 系统的一部分,这是这个来自贝尔实验室的技术的自然演变。

Bourne 打算做什么不同的事情?研究员 M. Jones 很好地概述了它:

Bourne shell 有两个主要目标:作为命令解释器以交互方式执行操作系统的命令,和用于脚本编程(编写可通过 shell 调用的可重用脚本)。除了替换 Thompson shell,Bourne shell 还提供了几个优于其前辈的优势。Bourne 将控制流、循环和变量引入脚本,提供了更具功能性的语言来(以交互式和非交互式)与操作系统交互。该 shell 还允许你使用 shell 脚本作为过滤器,为处理信号提供集成支持,但它缺乏定义函数的能力。最后,它结合了我们今天使用的许多功能,包括命令替换(使用后引号)和 HERE 文档(以在脚本中嵌入保留的字符串文字)。

Bourne 在之前的一篇采访中这样描述它:

最初的 shell (编程语言)不是一种真正的语言;它是一种记录 —— 一种从文件中线性执行命令序列的方法,唯一的控制流的原语是 GOTO 到一个标签。Ken Thompson 所编写的这个最初的 shell 的这些限制非常重要。例如,你无法简单地将命令脚本用作过滤器,因为命令文件本身是标准输入。而在过滤器中,标准输入是你从父进程继承的,不是命令文件。

最初的 shell 很简单,但随着人们开始使用 Unix 进行应用程序开发和脚本编写,它就太有限了。它没有变量、它没有控制流,而且它的引用能力非常不足。

对于脚本编写者来说,这个新 shell 是一个巨大的进步,但前提是你可以使用它。

以自由软件来重新构思 Bourne Shell

在此之前,这个占主导地位的 shell 是由贝尔实验室拥有和管理的专有软件。幸运的话,你的大学可能有权访问 Unix shell。但这种限制性访问远非自由软件基金会(FSF)想要实现的世界。

Richard Stallman 和一群志同道合的开发人员那时正在编写所有的 Unix 功能,其带有可以在 GNU 许可证下免费获得的许可。其中一个开发人员的任务是制作一个 shell,那位开发人员是 Brian Fox。他对他的任务的讲述十分吸引我。正如他在播客上所说:

它之所以如此具有挑战性,是因为我们必须忠实地模仿 Bourne shell 的所有行为,同时允许扩展它以使其成为一个供人们使用的更好工具。

而那时也恰逢人们在讨论 shell 标准是什么的时候。在这一历史背景和将来的竞争前景下,流行的 Bourne shell 被重新构想,并再次重生。

重新打造 Bourne Shell

自由软件的使命和竞争这两个催化剂使重制的 Bourne shell(Bash)具有了生命。和之前不同的是,Fox 并没有把 shell 放到自己的名字之后命名,他专注于从 Unix 到自由软件的演变。(虽然 Fox Shell 这个名字看起来要比 Fish shell 更适合作为 fsh 命令 #missedopportunity)。这个命名选择似乎符合他的个性。正如 Fox 在剧集中所说,他甚至对个人的荣耀也不感兴趣;他只是试图帮助编程文化发展。然而,他并不是一个优秀的双关语。

而 Bourne 也并没有因为他命名 shell 的文字游戏而感到被轻视。Bourne 讲述了一个故事,有人走到他面前,并在会议上给了他一件 Bash T 恤,而那个人是 Brian Fox。

< 如显示不全,请左右滑动 >

Shell

发布于

创造者

Thompson Shell

1971

Ken Thompson

Bourne Shell

1977

Stephen Bourne

Bourne-Again Shell

1989

Brian Fox

随着时间的推移,Bash 逐渐成长。其他工程师开始使用它并对其设计进行改进。事实上,多年后,Fox 坚定地认为学会放弃控制 Bash 是他一生中最重要的事情之一。随着 Unix 让位于 Linux 和开源软件运动,Bash 成为开源世界的至关重要的脚本语言。这个伟大的项目似乎超出了单一一个人的愿景范围。

我们能从 shell 中学到什么?

shell 是一项技术,它是笔记本电脑日常使用中的一个组成部分,你很容易忘记它也需要发明出来。从 Thompson 到 Bourne 再到 Bash,shell 的故事为我们描绘了一些熟悉的结论:

◈ 有动力的人可以在正确的使命中取得重大进展。

◈ 我们今天所依赖的大部分内容都建立在我们行业中仍然活着的那些传奇人物打下的基础之上。

◈ 能够生存下来的软件超越了其原始创作者的愿景。 代码英雄在全部的第三季中讲述了编程语言,并且正在接近它的尾声。 请务必订阅,来了解你想知道的有关编程语言起源的各种内容,我很乐意在下面的评论中听到你的 shell 故事。

作者: 选题: 译者: 校对:

本文由 原创编译, 荣誉推出返回搜狐,查看更多

责任编辑:

国内Linux shell,Bash shell 的诞生 | Linux 中国相关推荐

  1. linux 中输入bash,Linux上Bash Shell编程

    Linux下Bash Shell编程 Bash Shell Programming in Linux Linux下Bash Shell编程 Bash what? 进阶的内容是什么? Okay, I g ...

  2. 基于Linux的bash/shell编程基础

    目录 第一章 shell入门 1.什么是shell 2.shell入门 3,变量的定义和使用 4.接收用户输入(重点) 5.条件判断语句 6.运算符 6.1.算数运算符 6.2.关系运算符 6.3.逻 ...

  3. Linux之bash shell基本命令

    linux命令大全:https://man.linuxde.net/ 1.命令补全 当使用windows查找一个目录层级特别多的文件时,打开的效率会非常的慢,但如果使用linux查找一个目录层级特别多 ...

  4. bash linux .ee,Linux下Bash shell学习笔记.md

    ### 1.shell下没有变量类型和定义的概念. >1. 变量直接使用不用定义 >2. 所有值都视为字符串. >3. 在对变量取值都需要加$ >4. 行注释为 # + ### ...

  5. linux 10 -Bash Shell编程

    二十三. Bash Shell编程: 1.  读取用户变量:     read命令是用于从终端或者文件中读取输入的内建命令,read命令读取整行输入,每行末尾的换行符不被读入.在read命令后面,如果 ...

  6. 刨根问底:linux中bash shell中SIGHUP和SIGTERM信号的处理

    新人最容易发生的事情就是用ssh客户端(比如xshell)登录服务器之后,用&在后台执行了命令,第二天兴致勃勃去看任务,发现已经被kill了.一开始我学到的知识是,运行的后台命令都需要nohu ...

  7. Linux基于bash命令实验报告,Linux操作系统实验报告1

    Linux操作系统实验报告1 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该文档所 ...

  8. shell bash shell 语法中的字符串拼接 合并

    shell中的字符串拼接比较人性化,非常直观. 比如要实现在一个变量中存储 "Hello Jim!", 而且可以更换里面的人名 Jim, Hello 和 ! 直接用双引号括起来: ...

  9. linux -ksh,Linux Shell - bash ksh

    我知道shell有好多种.例如:TCSH SHELL . BASH SHELL 等. 请问共有几种shell,他们都有什么区别? 我的系统是RH9,用的是什么shell/ 谢谢! 目前流行的Shell ...

最新文章

  1. Python三十年技术演变史
  2. Java第四次作业——面向对象高级特性(继承和多态)
  3. docker如何修改挂载路径(挂载目录)?(没弄完,先去弄别的)
  4. SpringMVC-开启静态资源访问权限
  5. 计算机软件系统包括应用软件和什么,计算机软件系统包括什么
  6. 复习-css列表和表格相关属性
  7. 我是如何帮助创业公司改进企业工作的
  8. sublime的使用
  9. 在国美购置iPad者可获差价1100元
  10. shell输出毫秒_【Linux】shell: 获取时间间隔到毫秒、微秒级别
  11. C++(八)— 死锁原因及解决方法
  12. 信息安全系统设计基础实验一 2013521120135216
  13. windows 安装Rabbit MQ
  14. 2022 SpringBoot的房屋租赁平台 房屋展示平台 留学生房屋租赁平台
  15. 并发编程学习之Callable接口
  16. FPGA(FIR)数字信号处理
  17. 华为服务器SNMP协议怎么修改,华为迈普交换机、瑞斯康达SNMP协议配置方法
  18. Windows中的NTUSER.DAT文件是什么?
  19. Python-爬虫抓取视频
  20. 2021-04-17

热门文章

  1. lingo3d学习之路
  2. 用AI监控员工制作披萨,这样的“丧心病狂”你接受吗
  3. OCR(人工神经网络汉字识别系统)
  4. ASP.NET如何导出excel和txt并可以个性化修改表头添加统计行等,并传回客户端下载
  5. python制作3d相册代码_Python使用matplotlib绘制3D图形(代码示例)
  6. ros中文社区_roslibjs-JavaScript中文网-JavaScript教程资源分享门户
  7. 移动号码卡忘记服务密码怎么办
  8. 深度 | 区块链对人工智能的变革:去中心化将带来数据新范式
  9. UiBot 数组遍历
  10. Fiddler抓包工具入门及常用功能详解