不同类型Shell的介绍与使用

立即解锁
发布时间: 2025-09-09 01:53:50 阅读量: 7 订阅数: 22 AIGC
PDF

Linux命令行进阶之旅

### 不同类型 Shell 的介绍与使用 #### 1. 常见 Shell 的发展背景 在 Unix 系统的发展历程中,出现了多种不同的 Shell。最初,Korn shell 是 AT&T 公司的专有软件,直到 2000 年才以开源许可证发布。当 POSIX 对 Unix 系统上使用的 Shell 进行标准化时,它指定了 Korn shell 的一个子集,该子集与早期的 Bourne shell 基本兼容。因此,大多数 Bourne 类型的 Shell 现在都符合 POSIX 标准,但也包含了各种扩展。 部分由于 Korn shell 的专有许可,GNU 项目开发了 bash,它包含了许多 Korn shell 的特性。bash 的第一个版本由 Brian Fox 于 1989 年编写,如今由 Chet Ramey 维护。bash 是大多数 Linux 发行版的默认 Shell,也是 macOS 的默认 Shell,但由于苹果对保密性和封闭性的执着,他们拒绝将 bash 更新到版本 4,因为 GNU GPLv3 中的条款。 自 bash 开发以来,Z shell(zsh)逐渐在 Linux 和 macOS 用户中流行起来。zsh 有时被描述为“Shell 中的 Emacs”,因为它具有大量的特性,为交互式使用添加了许多功能。 #### 2. 现代 Linux 系统中的 Shell 选择 现代 Linux 用户有多种 Shell 程序可供选择,其中 bash 是最受欢迎的,因为它是大多数 Linux 发行版的默认 Shell。不过,从其他 Unix 或类 Unix 系统迁移过来的用户可能更习惯使用其他 Shell。此外,还存在可移植性的问题。如果脚本需要在多个类 Unix 系统上运行,则必须注意以下两点: 1. 确保所有系统都运行相同的 Shell 程序。 2. 编写符合 POSIX 标准的脚本,因为大多数现代 Bourne shell 派生版本都符合 POSIX 标准。 #### 3. 参考脚本示例 为了比较各种 Shell 方言,以下是一个 bash 脚本示例: ```bash #!/bin/bash # longest-word : find longest string in a file for i; do if [[ -r "$i" ]]; then max_word= max_len=0 for j in $(strings "$i"); do len=${#j} if (( len > max_len )); then max_len=$len max_word=$j fi done echo "$i: '$max_word' ($max_len characters)" fi done ``` #### 4. 不同类型 Shell 介绍 ##### 4.1 dash - Debian Almquist Shell dash 是 Debian 对 Almquist shell(ash)的改编,ash 最初由 Kenneth Almquist 在 20 世纪 80 年代编写。ash 是几种 BSD 版本的 Unix 的默认 Shell。dash 和它的祖先 ash 一样,具有体积小、速度快的优点,但它牺牲了一些交互式使用的便利性,如命令历史记录和编辑功能。它还缺少一些内置命令,而是依赖外部程序。它主要用于执行 Shell 脚本,特别是在系统启动期间。在 Debian 和相关发行版(如 Ubuntu)中,dash 被链接到 /bin/sh,用于运行系统初始化脚本。 以下是一个 dash 脚本示例: ```bash #!/bin/dash # longest-word.dash : find longest string in a file for i; do if [ -r "$i" ]; then max_word= max_len=0 for j in $(strings "$i"); do len=${#j} if [ $len -gt $max_len ]; then max_len=$len max_word=$j fi done echo "$i: '$max_word' ($max_len characters)" fi done ``` dash 脚本与 bash 参考脚本基本相同,但也有一些差异。例如,dash 不支持条件测试的 ‘[[’ 语法,它使用较旧的 Bourne shell 语法。POSIX 规范也缺少 ((expression)) 用于算术扩展的语法,也不支持大括号扩展。不过,dash 和 POSIX 规范支持 $(cmd) 用于命令替换的语法,以及较旧的 `cmd` 语法。 ##### 4.2 tcsh - TENEX C Shell tcsh 程序由 Ken Greer 在 20 世纪 80 年代初开发,作为原始 csh 程序的增强替代品。TENEX 这个名字来自同名的操作系统,它对 tcsh 的交互式功能设计产生了影响。与 csh 相比,tcsh 增加了额外的命令历史记录功能、Emacs 和 vi 风格的命令行编辑、拼写纠正等交互式使用的改进。苹果早期版本的 OS X 使用 tcsh 作为默认 Shell,它仍然是几个 BSD 发行版的默认根 Shell。 以下是一个 tcsh 脚本示例: ```tcsh #!/usr/bin/tcsh # longest-word.tcsh : find longest string in a file foreach i ($argv) set max_word="" set max_len=0 foreach j (`strings $i`) set len=$%j if ($len > $max_len) then set max_word=$j set max_len=$len endif end echo "$1 : $max_word ($max_len characters)" end ``` 我们可以看到,tcsh 脚本与 Bourne 风格的语法有很多不同。在 C shell 中,大多数流程控制语句都不同。例如,外层循环以 foreach 语句开始,使用 $argv 中的后续值递增变量 i。argv 来自 C 编程语言,指的是包含命令行参数列表的数组。 虽然这个简单的脚本可以工作,但当事情变得更复杂时,tcsh 的能力就有限了。它有两个主要弱点: 1. 不支持用户定义的函数。作为一种解决方法,可以从主脚本中调用单独的脚本来执行各个函数。 2. 许多使用 POSIX shell 可以轻松完成的复杂结构,如: ```bash { if [[ "$a" ]]; then grep "string1" else grep "string2" fi } < file.txt ``` 在 tcsh 中是不可能实现的,因为 C shell 解析器无法处理带有流程控制语句的重定向。解析器也使引号处理变得非常麻烦。 ##### 4.3 ksh - Korn Shell Korn shell 有几种不同的版本,基本上分为 ksh88 和 ksh93 两组,反映了它们的发布年份。有一个公共领域的 ksh88 版本称为 pdksh,以及 ksh88 和 ksh93 的更官方版本。这三个版本都可用于 Linux。对于大多数用户来说,ksh93 是首选版本,因为它是大多数现代商业 Unix 系统上使用的版本。在安装过程中,它通常被符号链接为 ksh。 以下是一个 ksh 脚本示例: ```ksh #!/usr/bin/ksh # longest-word.ksh : find longest string in a file for i; do if [[ -r "$i" ]]; then max_word= max_len=0 for j in $(strings "$i"); do len=${#j} if (( len > max_len )); then max_len=$len max_word=$j fi done print "$i: '$max_word' ($max_len characters)" fi done ``` 从这个示例可以看出,ksh 语法与 bash 非常接近。一个明显的区别是使用
corwn 最低0.47元/天 解锁专栏
买1年送3月
继续阅读 点击查看下一篇
profit 400次 会员资源下载次数
profit 300万+ 优质博客文章
profit 1000万+ 优质下载资源
profit 1000万+ 优质文库回答
复制全文

相关推荐

吴雄辉

高级架构师
10年武汉大学硕士,操作系统领域资深技术专家,职业生涯早期在一家知名互联网公司,担任操作系统工程师的职位负责操作系统的设计、优化和维护工作;后加入了一家全球知名的科技巨头,担任高级操作系统架构师的职位,负责设计和开发新一代操作系统;如今为一名独立顾问,为多家公司提供操作系统方面的咨询服务。
最低0.47元/天 解锁专栏
买1年送3月
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看

最新推荐

质量矩阵集中与一致表达方式对比,C++实现全解

![质量矩阵集中与一致表达方式对比,C++实现全解](https://cdn.bulldogjob.com/system/photos/files/000/004/272/original/6.png) # 摘要 质量矩阵是工程力学与数值仿真中的核心概念,广泛应用于有限元分析和动力系统建模。本文系统阐述了质量矩阵的数学理论基础,包括其基本定义、分类特性及其在数值方法中的关键作用。针对集中质量矩阵与一致质量矩阵两种主要形式,文章详细介绍了其构建原理与C++实现技术,涵盖数据结构设计、矩阵存储方式及基于Eigen库的具体编程实践。通过对比分析两者在精度、效率与适用场景上的差异,本文提供了工程

TOA定位精度优化实战:通过数据预处理提升效果的5个技巧

![TOA定位精度优化实战:通过数据预处理提升效果的5个技巧](https://img-blog.csdnimg.cn/20190110103854677.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zNjY4ODUxOQ==,size_16,color_FFFFFF,t_70) # 摘要 TOA(Time of Arrival)定位技术作为高精度定位的重要手段,广泛应用于无线通信、导航与物联网领域。然而,受

彻底搞懂PATH与CLASSPATH:JDK配置中的核心环境变量解析

![彻底搞懂PATH与CLASSPATH:JDK配置中的核心环境变量解析](https://cdn.nlark.com/yuque/0/2021/png/371427/1617110562261-0f1fcc88-5c5f-43ad-ae99-6932e6e0ed3a.png?x-oss-process=image%2Fresize%2Cw_1125%2Climit_0&x-oss-process=image/resize,s_500,m_lfit) # 摘要 本文系统梳理了PATH与CLASSPATH这两个关键环境变量的基本概念、工作原理及其在Java开发中的核心作用。文章详细解析了P

安全下载Windows补丁全攻略:如何获取官方KB3033929?

![安全下载Windows补丁全攻略:如何获取官方KB3033929?](https://www.prosygma-cm.com/publics/upload/2021007/fin-win10-updates.jpg) # 摘要 本文系统阐述了Windows补丁的下载、安装及管理全流程,涵盖从补丁机制理解到企业级策略构建的各个方面。首先介绍了Windows补丁的分类、发布方式及KB编号体系,帮助用户精准识别和获取所需补丁。随后详细说明了通过Microsoft Update Catalog和命令行工具安全下载补丁的方法,并强调了文件验证的重要性。在安装环节,提供了手动安装步骤与常见问题排

STM32F407音频时钟配置黑科技:嵌入式开发者必备的精准调校技巧

![基于HAL库STM32F407的语音采集回放系统](https://img-blog.csdnimg.cn/direct/10c17a74ab934a1fa68313a74fae4107.png) # 摘要 本文围绕STM32F407微控制器在音频系统中的时钟配置与优化展开系统性研究,重点分析音频时钟体系结构及其配置方法。文章详细介绍了音频时钟的基本概念、STM32F407时钟源选择与PLL配置策略,以及硬件布线设计中的关键问题。结合STM32CubeMX工具,提供了音频时钟的配置流程与动态调校方法,并针对常见音频卡顿、失真及同步失败等问题提出解决方案。进一步地,文章探讨了高精度音频

包装印刷实战指南:ISOcoated_v2_300_eci从理论到落地的全流程解析

![ISOcoated_v2_300_eci](https://www.smart.md/image/cache/data/results-photos/article2/panasonic-tv-calibration-guide-unlocking-true-color-accuracy-1280x600.jpg) # 摘要 本文系统梳理了包装印刷全流程中的色彩管理理论与实践方法,重点围绕ISOcoated_v2_300_eci标准展开深入分析。内容涵盖色彩管理的基本原理、ICC配置文件的作用机制、设备色彩特性匹配以及色彩一致性控制的关键环节。文章详细介绍了该标准在印前处理、色彩转换

MH50多任务编程实战指南:同时运行多个程序模块的高效策略

![MH50多任务编程实战指南:同时运行多个程序模块的高效策略](https://learn.redhat.com/t5/image/serverpage/image-id/8224iE85D3267C9D49160/image-size/large?v=v2&px=999) # 摘要 MH50多任务编程是构建高效、稳定嵌入式系统的关键技术。本文系统阐述了MH50平台下多任务编程的核心概念、调度机制与实际应用方法。首先介绍多任务系统的基本架构及其底层调度原理,分析任务状态、优先级策略及资源同步机制;随后讲解任务创建、通信与同步等实践基础,并深入探讨性能优化、异常处理及多核并行设计等高级技

自动化实践指南:构建X13批量处理系统的4个关键步骤

![自动化实践指南:构建X13批量处理系统的4个关键步骤](https://img-blog.csdnimg.cn/20190110103854677.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zNjY4ODUxOQ==,size_16,color_FFFFFF,t_70) # 摘要 X13批量处理系统是一种面向高效任务调度与数据处理的分布式系统,旨在提升大规模数据处理场景下的性能与可靠性。本文系统地介绍了

【Kong + OpenTelemetry集成】:实现API全链路追踪的完整方案

![【Kong + OpenTelemetry集成】:实现API全链路追踪的完整方案](https://supabase.com/_next/image?url=%2Fimages%2Fblog%2Flaunch-week-sql-day-4-reports-and-metrics%2Freports-infra.png&w=3840&q=75) # 摘要 本文围绕Kong与OpenTelemetry的集成,系统探讨了API全链路追踪的技术背景、核心原理与实践路径。文章首先介绍了分布式追踪的基本概念与Kong网关的可观测性机制,分析了OpenTelemetry在服务网格中的关键作用;随后

内核级权限控制:从模块视角深入解析SD ID修改器的运行机制

![SD ID 修改器](https://media.9game.cn/gamebase/ieu-eagle-docking-service/images/20240124/2/2/d37b5de1ae42ceb85cebfa2e758cbe37.png) # 摘要 本文围绕权限控制与ID修改技术展开,系统梳理了Linux内核中用户权限管理的基本机制,深入分析了UID/GID模型、LSM安全框架及ID修改相关系统调用的实现路径。在此基础上,设计并实现了一种内核级SD ID修改器,详细阐述其模块架构、凭证修改机制及用户与内核空间的通信方式。文章进一步剖析该修改器的运行流程,探讨其在系统安全