32、常见Shell及相关工具的全面解析

常见Shell及相关工具的全面解析

1. 相关Shell的优先级与标准

在Shell编程中, eval exec exit export readonly return set shift trap unset 这些命令的优先级高于函数。同时,POSIX标准旨在促进Shell脚本的可移植性,它避免提及某些基本的实现问题,例如不要求在后台作业、子Shell等操作中使用多任务处理,这样可以使Shell在像MS - DOS这样的非多任务系统上也能符合POSIX标准。

2. 不同Shell的特点
2.1 Korn Shell

Korn Shell是“传统”Shell(如Bourne和C Shell)的主要替代方案之一,于1986年作为AT&T“实验工具包”的一部分公开发布,由David Korn编写。1988年11月发布的版本应用最为广泛,但它并不完全符合POSIX标准,相比bash的合规性更低。1993年的版本在合规性上有所提升,还增加了更多功能并优化了现有功能。

与bash相比,Korn Shell有以下重要区别:
- 函数更像是独立的实体,与调用它的Shell不共享陷阱和选项。
- 支持关联数组。
- 支持浮点数和表达式。
- 支持协程,两个进程可以通过 print read 命令进行通信。
- 用 print 命令替代 echo print 可以指定文件描述符,用于与协程通信。
- 支持函数自动加载,函数只有在被调用时才会被读入内存。
- 支持一维数组,但数组大小有限(早期版本的ksh93为4096个元素,后期版本为64K个元素)。
- 历史记录保存在文件中而非内存,允许多个Shell实例访问相同的历史记录。
- 没有默认的启动文件,如果未定义环境变量 ENV ,则不会读取任何文件。
- 用更严格的 whence 命令替代 type 命令。

此外,Korn Shell的启动和环境文件与bash不同,由 .profile ENV 变量指定的文件组成,默认环境文件可以通过 ENV 变量覆盖,且没有注销文件。Korn Shell是bash的一个不错替代方案,但其主要缺点是每隔几年才进行一次升级。

2.2 pdksh

pdksh(公共领域Korn Shell)是Korn Shell的一个免费版本,可在互联网上获取其源代码。它基于Charles Forsyth的公共领域Version 7 Bourne Shell编写,具有所有Bourne Shell的功能,以及一些POSIX扩展和自身的特点,例如用户可自定义波浪号表示法,可将 ~ 设置为任何内容的缩写,而不仅仅是用户名。

不过,pdksh缺少官方Korn版本和bash的一些功能,如内置变量 PS4 、高级I/O重定向符 >| <> errexit noclobber privileged 选项。其优点是可执行文件大小约为bash的三分之一,运行速度更快;缺点是POSIX合规性较低,代码控制不如bash严格,产品不够完善,文档也不够详细。对于那些不想使用bash且无法获取Korn Shell的人来说,pdksh是一个值得考虑的替代方案。

2.3 zsh

zsh是一个强大的交互式Shell和脚本语言,具有bash、ksh和tcsh的许多功能,以及一些独特的特性。它由Paul Falsted在20世纪90年代初编写,现在由多人维护。zsh可免费获取,能在大多数现代Unix系统上编译和运行,也有其他操作系统的移植版本。

与bash相比,zsh的主要区别如下:
- 具有扩展的通配功能。
- 文本补全系统稍显高级。
- 拥有强大的多行命令行编辑器。
- 具备各种视觉效果,如命令提示符的颜色和位置设置。

zsh是bash的一个很好的替代方案,尤其适合“高级用户”。

3. 类Unix平台上的Shell克隆环境

随着Shell的不断发展,许多在UNIX系统上有经验的程序员进入PC领域后,希望拥有类似UNIX的环境。因此,出现了一些小型计算机操作系统的UNIX Shell风格接口,甚至是完整的Unix“环境”。以下是几种常见的环境:

3.1 Cygwin

Cygnus Consulting(现为Red Hat的一部分)创建了Cygwin环境。它首先创建了 cgywin.dll 共享库,用于模拟Unix系统调用,然后将大量GNU实用工具移植到各种版本的Microsoft Windows上。该环境在Windows/NT、Windows 2000和Windows XP上功能最为强大,但也能在Windows 95/98/ME上运行。Cygwin使用bash作为Shell,GCC作为C编译器,以及其他GNU实用工具作为Unix工具集,通过复杂的 mount 命令将Windows的 C:\path 表示法映射为Unix文件名。其项目网站为http://www.cygwin.com 。

3.2 DJGPP

DJGPP套件为MS - DOS环境提供32位GNU工具。它是一个完整的32位C/C++开发系统,适用于运行MS - DOS的Intel 80386(及更高版本)PC。该系统包括许多GNU开发实用工具的移植版本,开发工具和生成的程序都需要80386或更新的计算机才能运行。在大多数情况下,生成的程序可以商业销售而无需许可证或版税。DJGPP本质上是在MS - DOS之上构建的完整Unix环境,使用所有GNU工具和bash作为Shell。与Cygwin或UWIN不同,它不需要Windows版本,只需要一个完整的32位处理器和MS - DOS。其网站为http://www.delorie.com/djgpp/ 。

3.3 MKS Toolkit

MKS Toolkit是PC领域最成熟的Unix环境之一,由Mortice Kern Systems提供。它有不同的版本,适用于不同的开发环境和开发人员数量。该工具包包括一个符合POSIX标准的Shell,以及1988年Korn Shell的几乎所有功能,还有超过300个实用工具,如 awk perl vi make 等。其库支持超过1500个Unix API,非常适合移植到Windows环境。更多信息可在http://www.mkssoftware.com/products/tk/ds_tkdev.asp 上获取。

3.4 AT&T UWIN

UWIN是David Korn及其同事开发的项目,旨在为Microsoft Windows提供Unix环境。它的结构与Cygwin类似,通过共享库 posix.dll 模拟Unix系统调用API,系统调用模拟非常完整。一个有趣的特点是可以将Windows注册表作为文件系统在 /reg 下访问。在Unix API模拟之上,编译并运行了ksh93和超过200个Unix实用工具(或重新实现的版本)。UWIN环境依赖于原生的Microsoft Visual C/C++编译器,但也可以下载并使用GNU开发工具。其项目网站为http://www.research.att.com/sw/tools/uwin/ ,该网站提供了可用资源的描述、二进制文件下载链接、商业许可信息以及相关论文和其他类似软件的链接。

4. bash的调用选项

在调用bash时,可以使用不同的选项。以下是当前版本和旧的1.x版本的命令行选项:

4.1 当前版本(Table B - 1)
选项 含义
-c string 从字符串中读取命令,如果存在,字符串后的任何参数将被解释为位置参数,从 $0 开始。
-D 打印所有以 $ 开头的双引号字符串列表,这些字符串在当前区域设置不是C或POSIX时会进行语言翻译。同时开启 -n 选项。
-i 交互式Shell,忽略 TERM INT QUIT 信号。在作业控制生效时,也忽略 TTIN TTOU TSTP 信号。
-l 使bash表现得像作为登录Shell调用一样。
-o option 接受与 set -o 相同的参数。
-O, +O shopt - option shopt - option shopt 内置命令接受的Shell选项之一。如果存在 shopt - option -O 设置该选项的值, +O 取消设置。如果未提供 shopt - option ,则在标准输出上打印 shopt 接受的Shell选项的名称和值。如果调用选项是 +O ,输出格式可作为输入重用。
-s 从标准输入读取命令。如果给bash提供了参数,此标志优先,即参数不会被视为脚本名称,而是从标准输入读取。
-r 受限Shell。
-v 读取Shell输入行时打印它们。
- 表示选项结束,禁用进一步的选项处理。此符号后的任何选项将被视为文件名和参数。 -- - 同义。
–debugger 在Shell启动前执行调试器配置文件,开启扩展调试模式和Shell函数跟踪(仅适用于bash 3.0及更高版本)。
–dump - strings -D 功能相同。
–dump - po - strings -D 功能相同,但输出为GNU gettext po(可移植对象)文件格式。
–help 显示使用信息并退出。
–login 使bash表现得像作为登录Shell调用一样,与 -l 相同。
–noediting 如果是交互式Shell,不使用GNU readline库读取命令行。
–noprofile 不读取启动文件 /etc/profile 或任何个人初始化文件。
–norc 如果是交互式Shell,不读取初始化文件 ~/.bashrc 。如果Shell以 sh 调用,此选项默认开启。
–posix 当bash的默认操作与POSIX指南不同时,使bash的行为更符合POSIX指南。
–quiet 启动Shell时不显示任何信息,这是默认设置。
–rcfile file, –init - file file 如果是交互式Shell,执行从文件中读取的命令,而不是初始化文件 ~/.bashrc
–verbose 等同于 -v
–version 显示此bash实例的版本号并退出。
4.2 旧的1.x版本(Table B - 2)
选项 含义
-c string 从字符串中读取命令,如果存在,字符串后的任何参数将被解释为位置参数,从 $0 开始。
-i 交互式Shell,忽略 TERM INT QUIT 信号。在作业控制生效时,也忽略 TTIN TTOU TSTP 信号。
-s 从标准输入读取命令。如果给bash提供了参数,此标志优先,即参数不会被视为脚本名称,而是从标准输入读取。
-r 受限Shell。
- 表示选项结束,禁用进一步的选项处理。此符号后的任何选项将被视为文件名和参数。 -- - 同义。
-norc 如果是交互式Shell,不读取初始化文件 ~/.bashrc 。如果Shell以 sh 调用,此选项默认开启。
-noprofile 不读取启动文件 /etc/profile 或任何个人初始化文件。
-rcfile file 如果是交互式Shell,执行从文件中读取的命令,而不是初始化文件 ~/.bashrc
-version 启动时显示此bash实例的版本号。
5. 命令行提示字符串自定义

bash的命令行提示字符串可以进行自定义,不同版本支持的自定义命令有所不同。以下是一些常见的自定义命令及其含义:
| 命令 | 含义 |
| — | — |
| \a | ASCII响铃字符(007) |
| \A | 当前时间,24小时制的 HH:MM 格式 |
| \d | 日期,格式为“星期 月份 日” |
| \D {format} | 将 format 传递给 strftime(3) 函数,结果插入到提示字符串中;空格式将显示特定于区域设置的时间表示;必须使用花括号 |
| \e | ASCII转义字符(033) |
| \H | 主机名 |
| \h | 主机名,直到第一个“.” |
| \j | 当前由Shell管理的作业数量 |
| \l | Shell终端设备名称的基本名称 |
| \n | 回车换行符 |
| \r | 回车符 |
| \s | Shell的名称 |
| \T | 当前时间,12小时制的 HH:MM:SS 格式 |
| \t | 当前时间, HH:MM:SS 格式 |
| \@ | 当前时间,12小时制的 a.m./p.m. 格式 |
| \u | 当前用户的用户名 |
| \v | bash的版本号(例如,2.00) |
| \V | bash的发布版本,包括版本号和补丁级别(例如,3.00.0) |
| \w | 当前工作目录 |
| \W | 当前工作目录的基本名称 |
| # | 当前命令的命令编号 |
| ! | 当前命令的历史编号 |
| \$ | 如果有效用户ID为0,打印 # ,否则打印 $ |
| \nnn | 八进制字符代码 |
| \ | 打印反斜杠 |
| [ | 开始一系列非打印字符,如终端控制序列 |
| ] | 结束一系列非打印字符 |

6. 内置命令和保留字

bash中有许多内置命令和保留字,以下是它们的简要总结:
| 命令 | 章节 | 类型 | 总结 |
| — | — | — | — |
|! | 5 | R | 命令退出状态的逻辑非。 |
| : | 7 | | 不执行任何操作(仅对任何参数进行扩展)。 |
|. | 4 | | 读取文件并在当前Shell中执行其内容。 |
| alias | 3 | | 为命令或命令行设置简写。 |
| bg | 8 | | 将作业放入后台。 |
| bind | 2 | | 将键序列绑定到readline函数或宏。 |
| break | 5 | | 从周围的 for select while until 循环中退出。 |
| builtin | 5 | | 执行指定的Shell内置命令。 |
| case | 5 | R | 保留字,多路条件构造。 |
| cd | 1 | | 更改工作目录。 |
| command | 7 | | 绕过Shell函数查找运行命令。 |
| compgen | D | | 生成可能的补全匹配项。 |
| complete | D | | 指定补全的执行方式。 |
| continue | | | 跳过 for select while until 循环的下一次迭代。 |
| declare | 6 | | 声明变量并赋予属性。 |
| dirs | 6 | | 显示当前记住的目录列表。 |
| disown | 8 | | 从作业表中移除作业。 |
| do | 5 | R | for select while until 循环构造的一部分。 |
| done | 5 | R | for select while until 循环构造的一部分。 |
| echo | 4 | | 扩展并打印任何参数。 |
| elif | 5 | R | if 构造的一部分。 |
| else | 5 | R | if 构造的一部分。 |
| enable | 7 | | 启用和禁用内置Shell命令。 |
| esac | 5 | R | case 构造的一部分。 |
| eval | 7 | | 通过命令行处理运行给定的参数。 |
| exec | 9 | | 用给定的程序替换Shell。 |
| exit | 5 | | 从Shell退出。 |
| export | 3 | | 创建环境变量。 |
| fc | 2 | | 修复命令(编辑历史文件)。 |
| fg | 8 | | 将后台作业放入前台。 |
| fi | 5 | R | if 构造的一部分。 |
| for | 5 | R | 循环构造。 |
| function | 4 | R | 定义函数。 |
| getopts | 6 | | 处理命令行选项。 |
| hash | 3 | | 确定并记住完整路径名。 |
| help | 1 | | 显示内置命令的帮助信息。 |
| history | 1 | | 显示命令历史记录。 |
| if | 5 | R | 条件构造。 |
| in | 5 | R | case 构造的一部分。 |
| jobs | 1 | | 列出任何后台作业。 |
| kill | 8 | | 向进程发送信号。 |
| let | 6 | | 算术变量赋值。 |
| local | 4 | | 创建局部变量。 |
| logout | 1 | | 退出登录Shell。 |
| popd | 4 | | 从目录栈中移除目录。 |
| pushd | 4 | | 向目录栈中添加目录。 |
| pwd | 1 | | 打印工作目录。 |
| read | 7 | | 从标准输入读取一行。 |
| readonly | 6 | | 使变量只读(不可赋值)。 |
| return | 5 | | 从周围的函数或脚本返回。 |
| select | 5 | R | 菜单生成构造。 |
| set | 3 | | 设置选项。 |
| shift | 6 | | 移动命令行参数。 |
| suspend | | | 暂停Shell的执行。 |
| test | 5 | | 计算条件表达式。 |
| then | 5 | R | if 构造的一部分。 |

通过了解这些不同的Shell及其特点、调用选项、提示字符串自定义、内置命令和保留字,开发者可以根据自己的需求选择合适的工具和环境,提高工作效率和编程体验。

常见Shell及相关工具的全面解析

7. 不同Shell特点对比总结

为了更清晰地对比不同Shell的特点,下面用表格形式进行总结:
| Shell名称 | 主要特点 | 与bash对比 | 适用场景 |
| — | — | — | — |
| Korn Shell | 支持关联数组、浮点数和表达式、协程;函数更独立;历史记录存文件;用 print 替代 echo 等 | 1988版POSIX合规性低于bash,1993版有所提升;有诸多独特功能 | 对特定高级功能有需求,且能接受升级周期长 |
| pdksh | 基于Bourne Shell,有POSIX扩展和自定义波浪号表示法 | 可执行文件小、运行快,但缺少bash部分功能,合规性低,产品不完善 | 不想用bash且无法获取Korn Shell |
| zsh | 有扩展通配功能、高级文本补全、多行命令行编辑器和视觉效果 | 有独特功能,适合高级用户 | 高级用户追求强大交互和独特功能 |

通过这个表格,开发者能更直观地根据自身需求选择合适的Shell。

8. 类Unix平台环境对比

同样,为了清晰对比类Unix平台上的不同环境,给出如下表格:
| 环境名称 | 主要特点 | 依赖系统 | 工具集 | 适用场景 |
| — | — | — | — | — |
| Cygwin | 用 cgywin.dll 模拟Unix系统调用,移植GNU工具到Windows | 多种Windows版本 | bash、GCC、GNU实用工具 | 在Windows上使用Unix工具和bash |
| DJGPP | 为MS - DOS提供32位GNU工具,构建完整Unix环境 | MS - DOS,32位处理器 | 所有GNU工具、bash | 基于MS - DOS的开发,无需Windows |
| MKS Toolkit | 有符合POSIX标准的Shell,含Korn Shell功能和超300个实用工具,库支持超1500个Unix API | Windows | 自定义POSIX合规Shell、众多实用工具 | Windows上的专业Unix开发 |
| AT&T UWIN | 用 posix.dll 模拟Unix系统调用,可访问Windows注册表,运行ksh93和超200个Unix实用工具 | Windows | ksh93、Unix实用工具 | Windows上对Unix环境有需求,想用ksh93 |

9. 调用bash选项的使用建议

在实际使用中,根据不同的场景选择合适的bash调用选项很重要,以下是一些使用建议:
- 交互式使用 :如果是在交互式环境下工作,建议使用 -i 选项,它能忽略一些信号,让交互更稳定。例如,当你在终端中手动输入命令时,使用 bash -i 启动Shell。
- 脚本执行 :若要执行一个脚本文件,通常不需要额外的特殊选项。若脚本中有需要特定环境设置的内容,可以考虑使用 --rcfile 指定自定义的初始化文件。比如 bash --rcfile my_custom_rc.sh my_script.sh
- 调试脚本 :对于脚本调试,可以使用 --debugger 选项(bash 3.0及以上),它能开启扩展调试模式和函数跟踪,方便定位问题。
- 遵循POSIX标准 :当脚本需要在不同系统间有更好的可移植性时,使用 --posix 选项,让bash行为更符合POSIX指南。

10. 命令行提示字符串自定义的应用

命令行提示字符串的自定义可以让用户根据自己的喜好和工作需求来定制终端显示。以下是一些常见的应用场景:
- 显示当前时间 :使用 \A \t 等选项可以在提示字符串中显示当前时间。例如,设置 PS1="[\A] \w \$ " ,这样每次打开终端时,提示字符串会显示当前时间和工作目录。
- 显示用户名和主机名 :通过 \u \H 可以显示当前用户名和主机名,如 PS1="\u@\H:\w \$ " ,方便用户了解当前登录的用户和主机信息。
- 区分不同环境 :可以根据不同的环境(如开发、测试、生产)设置不同的提示字符串颜色。例如,在开发环境中设置绿色提示字符串,在生产环境中设置红色提示字符串,以提醒用户当前所处的环境。可以使用 \e (ASCII转义字符)来实现颜色设置,如 PS1="\e[32m\u@\H:\w \$\e[0m " (绿色)和 PS1="\e[31m\u@\H:\w \$\e[0m " (红色)。

11. 内置命令和保留字的使用流程

为了更好地使用bash的内置命令和保留字,下面给出一个简单的使用流程mermaid流程图:

graph TD;
    A[开始] --> B{选择操作类型};
    B -->|条件判断| C(使用if、case等保留字);
    B -->|循环操作| D(使用for、while、until等保留字);
    B -->|文件操作| E(使用cd、pwd等命令);
    B -->|变量操作| F(使用declare、export等命令);
    B -->|作业控制| G(使用bg、fg、jobs等命令);
    C --> H[执行相应操作];
    D --> H;
    E --> H;
    F --> H;
    G --> H;
    H --> I{是否完成操作};
    I -->|是| J[结束];
    I -->|否| B;

这个流程图展示了根据不同的操作需求选择合适的内置命令和保留字,然后执行相应操作,最后判断是否完成操作的过程。

12. 总结与展望

通过对常见Shell(如Korn Shell、pdksh、zsh)、类Unix平台环境(Cygwin、DJGPP、MKS Toolkit、AT&T UWIN)、bash调用选项、命令行提示字符串自定义以及内置命令和保留字的详细介绍,我们对这些工具和功能有了更深入的了解。

在未来的开发工作中,开发者可以根据具体的需求和场景,灵活选择合适的Shell和环境,利用各种选项和功能来提高工作效率和编程体验。例如,对于追求极致性能和特定功能的开发者,可以选择Korn Shell或zsh;对于在Windows环境下需要Unix工具的开发者,Cygwin或MKS Toolkit是不错的选择。同时,合理利用bash的调用选项和提示字符串自定义功能,可以让开发过程更加便捷和个性化。随着技术的不断发展,相信这些工具和功能也会不断完善和扩展,为开发者带来更多的便利。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值