dash shell

Debian的dash shell的历史很有趣。它是ash shell的直系后代,而ash shell则是Unix系统上原来
的Bourne shell的简化版本(参见第1章)。Kenneth Almquist为Unix系统开发了一个Bourne shell简化版本,并将它命名为Almquist shell,缩写为ash。ash shell最早的版本体积极小、速度奇快,
但缺乏许多高级功能,比如命令行编辑或命令使用记录功能,这使它很难用作交互式shell。
NetBSD Unix操作系统移植了ash shell,直到今天依然将它用作默认shell。NetBSD开发人员
对ash shell进行了定制,增加了一些新的功能,使它更接近Bourne shell。新功能包括使用emacs
和vi编辑器命令进行命令行编辑,利用历史命令来查看先前输入的命令。ash shell的这个版本也
被FreeBSD操作系统用作默认登录shellDebian Linux发行版创建了它自己的ash shell版本(称作Debian ash,或dash)以供自用。dash
复制了ash shell的NetBSD版本的大多数功能,提供了一些高级命令行编辑能力。
但令人不解的是,实际上dash shell在许多基于Debian的Linux发行版中并不是默认的shell。由
于bash shell在Linux中的流行,大多数基于Debian的Linux发行版将bash shell用作普通登录shell,
而只将dash shell作为安装脚本的快速启动shell,用于安装发行版文件。
流行的Ubuntu发行版是例外。这经常让shell脚本程序员摸不清头脑,给Linux环境中运行shell
脚本带来了很多问题。Ubuntu Linux发行版将bash shell用作默认的交互shell,但将dash shell用作 默认的/bin/sh shell。这个“特性”着实让shell脚本程序员一头雾水。
如第11章所述,每个shell脚本的起始行都必须声明脚本所用的shell。在bash shell脚本中,我
们一直用下面的行。
#!/bin/bash
它会告诉shell使用位于/bin/bash的shell程序来执行脚本。在Unix世界中,默认shell一直是
/bin/sh。许多熟悉Unix环境的shell脚本程序员会将这种用法带到他们的Linux shell脚本中。
#!/bin/sh
在大多数Linux发行版上,/bin/sh文件是链接到shell程序/bin/bash的一个符号链接
。这样你就可以在无需修改的情况下,轻松地将为Unix Bourne shell设计的shell脚本移植到Linux环境中。
很遗憾,Ubuntu Linux发行版将/bin/sh文件链接到了shell程序/bin/dash。由于dash shell只含原来Bourne shell中的一部分命令,这可能会(而且经常会)让有些shell脚本无法正确工作。
下一节将带你逐步了解dash shell的基础知识以及它跟bash shell的区别。如果你编写的bash
shell脚本可能要在Ubuntu环境中运行,了解这些内容就尤其重要。

dash shell 命令行参数

 dash   命令行参数
参 数 描 述
-a 导出分配给shell的所有变量
-c 从特定命令字符串中读取命令
-e 如果是非交互式shell的话,在有未经测试的命令失败时立即退出
-f 显示路径名通配符
-n 如果是非交互式shell的话,读取命令但不执行它们
-u 在尝试展开一个未设置的变量时,将错误消息写出到STDERR
-v 在读取输入时将输入写出到STDERR
-x 在执行命令时将每个命令写出到STDERR
-I 在交互式模式下,忽略输入中的EOF字符
-i 强制shell运行在交互式模式下
-m 启用作业控制(在交互式模式下默认开启)
-s 从STDIN读取命令(在没有指定文件参数时的默认行为)
-E 启用emacs命令行编辑器
-V 启用vi命令行编辑器

zsh shell

你可能会碰到的另一个流行的shell是Z shell(称作zsh)。zsh shell是由Paul Falstad开发的一个
开源Unix shell。它汲取了所有现有shell的设计理念并增加了许多独到的功能,为程序员创建了一
个无所不能的高级shell。
下面是zsh shell的一些独特的功能:
 改进的shell选项处理
 shell兼容性模式
 可加载模块
在这些功能中,可加载模块是shell设计中最先进的功能。你在bash和dash shell中已经看到过
了,每种shell都包含一组内建命令,这些命令无需借助外部工具程序就可以使用。内建命令的好
处在于执行速度快。shell不必在运行命令前先加载一个工具程序。内建命令已经在内存中了,随
时可用。
zsh shell提供了一组核心内建命令,并提供了添加额外命令模块(command module)的能力。
每个命令模块都为特定场景提供了另外一组内建命令,比如网络支持和高级数学功能。可以只添
加你觉得有用的模块。
这个功能提供了一个极佳的方式:在需要较小shell体积和较少命令时限制zsh shell的体积,
在需要更快执行速度时增加可用的内建命令数量。

其他shell的更多相关文章

  1. Shell替换

    如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. #!/bin/bash a= echo -e "Value of a is ...

  2. Shell特殊变量

    $ 表示当前Shell进程的ID,即pid $echo $$ 运行结果 特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数 ...

  3. shell变量

    定义变量 定义变量时,变量名不加美元符号($),如: variableName="value" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样.同时,变量名 ...

  4. 第一个shell脚本

    打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好. #!/bin/bash echo "Hello World !" &quo ...

  5. shell简介

    Shell作为命令语言,它交互式地解释和执行用户输入的命令:作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支. shell使用的熟练程度反映了用户对U ...

  6. Shell碎碎念

    1. 字符串如何大小写转换 str="This is a Bash Shell script." 1> tr方式 newstr=`tr '[A-Z]' '[a-z]' < ...

  7. MongoDB学习笔记二—Shell操作

    数据类型 MongoDB在保留JSON基本键/值对特性的基础上,添加了其他一些数据类型. null null用于表示空值或者不存在的字段:{“x”:null} 布尔型 布尔类型有两个值true和fal ...

  8. 使用C#给Linux写Shell脚本

    在这个逼格决定人格,鄙视链盛行的年头,尤其是咱们IT界,请问您今天鄙视与被鄙视的次数分别是多少?如果手中没有一点压箱的本事,那就只有看的份了.今天我们也要提升下自己的格调,学习些脑洞大开的东西,学完之 ...

  9. Linux环境下shell和vim中乱码原因及消除办法

    shell和vim中乱码原因及消除办法 作者:Jack47 在Linux下开发,经常遇到乱码问题:shell或者vim中显示不了中文,或者能够显示,但不能输入中文.每次都是上网去搜,或者同事告诉我一些 ...

  10. 【说解】在shell中通过mkfifo创建命名管道来控制多个进程并发执行

    背景: 工作中有两个异地机房需要传数据,数据全名很规范,在某个目录下命名为统一的前缀加上编号.如/path/from/file.{1..100}.而机房间的专线对单个scp进程的传输速度是有限制的,比 ...

随机推荐

  1. F#周报2019年第12期

    新闻 Amazon.Lambda.RuntimeSupport发布 Forge 3.0架构 Blazor 0.9.0试验版发布 通过微软游戏栈实现更多应用 介绍ASP.NET Core中的gRPC M ...

  2. 关于Mysql6.0+的时区错乱问题

    如果使用mysql6.0+的JDBC驱动版本的时候,有时候会出现程序时间与数据库时间相差很多个小时; 1.如果以北京时间为例,相差8个小时的情况一般是你在连接jdbc的url中没有标明system_t ...

  3. yii2安装与初始化

    yii2安装与初始化-Yii2学习笔记(一)   一.安装项目: 使用composer下载安装yii2 advanced安装包: composer create-project yiisoft/yii ...

  4. 学习ActiveMQ(二):点对点(队列)模式消息演示

    一:介绍 点对点的消息发送方式主要建立在 消息(Message ),队列(Queue),发送者(Sender),消费者(receiver)上,Queue 存贮消息,Sender 发送消息,receiv ...

  5. 当离开浏览器窗口,提示语title更改

    head里面插入一下代码 <script> document.addEventListener('visibilitychange',function(){if(document.visi ...

  6. dddquickly

    在项目开发最初的时候,他也有过一段狂欢般的快乐时光,不久之后,事情就越来越艰难. 项目的代码越来越难以维护,工作越来越像是一种煎熬,合作的同事对他越来越不满. “该是与这个项目,与这个公司说 bye ...

  7. React之ref

    作为响应式开发框架React,我们知道他是数据驱动的,但有时候避免不了还是得动用到DOM操作,这个时候我们就可以用到ref:用法如下: 然后这样做有个弊端,当一个 ul 下面的 li 是动态添加的时候 ...

  8. 正则re

    1.简介 其实re在基本模块里已经介绍过,但是在爬虫中re是非常重要的,所以在这里再进行详细描述. re在解析html内容时是效率最高的,但是也是最难的,一般来说,都是结合xpath和re使用,这样解 ...

  9. [LeetCode] 70. Climbing Stairs_ Easy tag: Dynamic Programming

    You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...

  10. LightGBM总结

    一.LightGBM介绍 LightGBM是一个梯度Boosting框架,使用基于决策树的学习算法.它可以说是分布式的,高效的,有以下优势: 1)更快的训练效率 2)低内存使用 3)更高的准确率 4) ...