shell计算机壳层
Shell是操作系统的外壳,负责接收用户输入的命令并传递给操作系统内核执行。它是交互式的和跨平台的,并具有脚本、管道和重定向、命令解析等功能。它允许用户与计算机系统交互并执行各种操作,如启动程序、管理文件和目录等。
在shell语言的发展历史上,最早的Thompson Shell是由Ken Ken Thompson创立的,后来的Bourne Shell和C Shell引入了现代Shell的更多特性和功能,成为Unix系统的标准Shell。常见的shell包括Bash、Zsh和Fish,它们广泛应用于不同的操作系统。
目前,计算机用户界面主要分为两种类型:命令行界面(CLI)和图形用户界面(GUI)。CLI是通过命令行输入文本命令与计算机进行交互的界面,通常用于服务器管理、系统维护、脚本编写和批处理操作。GUI通过图形元素和鼠标操作进行交互,并通过插件或扩展进行定制以满足用户的特定需求。随着其不断演进,shell语言在计算领域的影响力逐渐扩大,为用户提供了与操作系统高效交互的能力。
发展历史
shell语言的起源
1971年,Ken Thompson为UNIX创建了第一个shell-V6 shell。这个shell位于/bin/sh中,是一个独立的用户程序,它的执行不依赖于内核。与Multics的前身类似,它实现了通配符等概念(例如:*。txt),但这些功能并没有内置到shell中,而是在一个名为“glob”的独立实用程序中实现。同样,用于计算条件表达式的命令也是分开的。这种分离策略保持了shell的紧凑性,其源代码少于900行。
shell语言的演变
1977年,斯蒂芬·伯恩出版了《伯恩的壳》,以解决汤普森壳的剧本限制。该版本增加了额外的功能,例如调度脚本和循环的能力。Bourne shell不仅是一个重要的进步,而且现在主流Linux系统使用的许多shell都将其作为锚点。
1978年,C shell发布并迅速成为Unix系统上流行的命令解释器。它是由Bill Joy开发的Unix shell的变体。C shell的主要设计目标是它看起来更像C编程语言,并且更适合交互式使用。
1983年7月14日,大卫·科恩(大卫·科恩)在USENIX的年度技术会议上发布了科恩壳牌。它的开发目标是继承C shell和Tab C-shell的所有功能,包括脚本和循环处理,这些功能与Bourne shell相同。Ksh93是Korn shell的一个流行的开源版本,于1993年获得了开源的地位。在其与Bourne shell的良好兼容性中,还引入了其他shell语言的特性,例如csh的历史功能。
1989年,Bash是Brian Fox为GNU项目编写的Unix shell和命令语言,旨在成为Bourne shell的免费软件替代品。Bash的语法和功能受Bourne shell的影响,但增加了许多新功能和改进。作为Bourne shell的继承者,Bash继承了前代shell的许多功能,并引入了更多功能。即使在今天,Bash仍然是Unix和Linux社区中最常用的shell之一。
1989年5月30日,Almquist shell上市(通常简称为“ash”)。它是由Kenneth Almquist(Kenneth Almkvist)开发的轻量级Unix shell。它被设计为传统Bourne shell(sh)的更紧凑、更高效的替代品。Ash shell通常用于嵌入式系统和其他资源有限且效率至关重要的环境。在FreeBSD、NetBSD、DragonFly BSD和Minix上,默认安装的shell(/bin/sh)派生自ash。在Linux上,开发了Debian Almquist shell。
1990年,Z shell(zsh)是一个功能丰富的Unix shell,由Paul Falstad(Paul Follestad)开发。它在Bourne shell、Bash和Korn shell的基础上增加了许多新功能和改进,旨在提供一个更强大、更灵活的命令解释器环境。从macOS Catalina开始,Mac将使用zsh作为整个操作系统的默认登录shell和交互shell。
2005年,发布了新的命令行界面工具fish shell(也称为友好交互式shell)。它由Axel Liljencrantz等开发人员共同创建。其特点是具有自动补全、颜色突出显示和动态建议等便捷功能,并具有出色的可读性和丰富的插件生态。此外,fish shell还有一个活跃的开发者社区,不断推出新功能和优化改进。随着UNIX的流行,对更强大和通用的脚本语言的需求也在增加。Scheme shell(scsh)通过使用Scheme(LISP语言的衍生物)提供了一个脚本环境。Pyshell试图使用Python实现类似的功能。在嵌入式系统上,BusyBox将shell和所有命令集成到一个二进制可执行文件中,从而简化了分发和管理。许多早期的shell想法和接口已经保存了近35年,这是作者们不懈努力的证明。虽然外壳不断刷新自己,但本质上并没有太大变化。尽管有创造特殊外壳的新尝试,但Bourne shell及其衍生产品仍是使用最广泛的。
形式分类
Shell是用户与操作系统内核进行交互的界面,可以用命令行或图形界面两种形式表示。
图形用户界面外壳:GUI shell允许用户通过图形操作界面轻松选择、拖动和执行其他直观操作来执行任务和配置系统设置,这对新手用户来说更加友好和容易。相反,命令行shell需要用户输入特定的命令来执行操作,这需要用户具有一定的专业知识和技能。GUI shell通常作为桌面环境的一部分来实现,如GNOME、KDE等离子体、XFCE等。这些桌面环境提供了一系列组件,如窗口管理器、面板、系统托盘等。,它们构成了用户可以看到的图形界面。GUI shell中的资源管理器和设置界面等特定工具也是这些桌面环境的一部分。它们通常用各种编程语言和图形库(如GTK+、Qt等)编写。),它为创建图形界面提供了必要的功能和工具。
命令行外壳:CLI shell通常指用户通过命令行界面输入文本命令与操作系统进行交互的方式。用户可以直接键入命令来执行操作。常见命令行shell包括Bash、Zsh、Powershell等。在Linux或MacOS中,它通常被称为“终端”,而在Windows操作系统中,它被称为“命令提示符”或“Windows Powershell”。CLI shell为用户提供了一个接口,用户可以通过输入人类可读的命令与操作系统进行交互,例如“cat、ls、echo”。这些命令将被传递给shell执行,执行结果将显示在命令行界面上。CLI shell提供了管理文件、运行程序和执行系统操作的有效方法。
基本语法
外壳变量:Shell变量是shell程序中用来存储文本字符串或数字的变量。Shell变量通常用于存储临时值或用户输入,并且可以在shell程序执行期间进行修改和访问。在shell中,变量名都是字符串,可以包含字母、数字和下划线,并且必须以字母或下划线开头。常用的外壳变量包括环境变量、参数变量、位置变量和特殊变量。
壳程参数:当shell脚本执行时,您可以传入命令行参数,以便脚本可以根据这些参数执行特定的操作。这些传入的参数被脚本中的位置参数变量引用。位置参数变量$1、$2和$3分别对应于第一个、第二个和第三个传入参数,依此类推。此外,$ @用于获取所有传入参数,而$ #用于获取传入参数的数量。
外壳阵列:在shell脚本中,用户可以使用数组来存储一系列数值或字符串。在大多数Unix shell中,您可以使用Bash来操作数组。
壳牌过程控制:在Shell脚本中,流控制用于根据条件执行不同的代码块或控制循环的执行。
外壳文件包含:外壳文件包含意味着外壳脚本中的代码可以通过引用其他文件来执行。这对于从逻辑上将代码分解成多个文件以更好地管理和组织代码非常有用。在shell中,有几种方法可以包含其他文件,最常用的方法是使用source命令或。符号。
主要特性
交互性:交互式外壳:用户可以直接与外壳实时交互。用户可以输入命令,shell将立即执行这些命令并返回结果。该模式通常用于用户在命令行界面下直接与系统交互、输入命令、查看输出和管理文件。非交互式shell:由shell执行的命令:shell来自脚本文件或由重定向标准输入提供。在这种模式下,shell不会等待用户输入,而是直接执行脚本中的命令并将结果输出到指定的位置。该模式通常用于自动任务、批处理等场景。
脚本:Shell脚本是包含shell命令的文本文件,具有灵活性和可移植性。可以通过设置文件第一行的“shebang”来设置(如#!/bin/bash)来指定脚本的解释器,以便脚本可以找到正确的解释器在不同的系统上执行。同时,脚本可以接受和处理位置参数,并且可以通过设置执行权限直接运行,这使得shell脚本在自动化任务和系统管理中非常有用。
重定向:Shell重定向和管道允许用户灵活控制命令的输入和输出,实现数据的重定向和传输。通过重定向,用户可以将命令的输出保存到文件中,或者将文件中的内容作为命令的输入,甚至可以同时重定向标准输出和标准错误。但是,管道可以直接将一个命令的输出转移到另一个命令作为输入,从而实现命令之间的数据流通信和处理,从而提高数据处理的效率和灵活性。
命令解析:命令扩展:shell将从左到右解析、扩展和重定向命令。变量赋值和重定向将首先保存,未赋值或重定向的单词将被扩展,其中第一个扩展的单词被视为命令名,其余的作为参数。如果命令只包含赋值和重定向,则赋值会影响当前shell环境;如果命令名存在,则执行该命令。如果试图对只读变量赋值,或者重定向中有错误,命令将以非零状态退出。命令搜索和执行:shell将按照一定的顺序查找和执行命令。如果命令名不包含斜杠,shell将首先检查是否有同名的shell函数或内置命令,如果没有,它将在$PATH环境变量指定的目录中搜索可执行文件。如果命令名包含斜杠或搜索成功,shell将在单独的执行环境中执行该命令。如果执行失败并且文件不在可执行格式或目录中,则将其视为shell脚本并执行。最后,shell将等待命令完成并收集其退出状态。命令执行环境:每个简单的命令或shell函数都在一个单独的执行环境中运行,该环境继承自shell,但又与之隔离。该环境包括打开的文件、当前工作目录、文件创建模式掩码、导出的shell变量和函数等。子shell或子shell是shell进程的副本,其中运行的命令不会影响主shell环境。此外,在此隔离环境中,某些shell选项和陷阱设置可能会被重置或忽略。这些特点保证了命令执行的独立性和稳定性。
跨平台:以主流的bash脚本为例,官方提供了posix模式:通过使用- posix或set -o posix命令行选项,Bash可以进入posix模式,使其更符合POSIX标准,并调整一些默认行为以匹配POSIX指定的值。在POSIX模式下,Bash将执行一些特定的更改,包括设置变量POSIXLY_CORRECT,并再次搜索命令哈希表。Bash-4.0引入了shell兼容级别的概念,允许用户通过设置一组shopt选项来选择Bash的行为,从而在不同版本之间迁移脚本。在使用shell编写和执行脚本时,了解并熟悉这些不同模式和兼容级别的设置以确保脚本的正确性和跨平台性是非常重要的。根据特定要求选择适当的模式和兼容级别,以确保脚本可以正常运行并在不同的环境中表现出相同的行为。
安全性能
数据加密和解密:OpenSSL是一个开源的密码学工具包,它提供了一系列加密和解密算法以及SSL/TLS协议的实现。它用于保护网络通信的安全,包括加密、解密、证书颁发、数字签名等功能。通过使用这些方法,用户可以保护敏感数据的安全,并确保只有授权用户才能访问这些数据。日志记录:在Unix系统上,rSyslogd和syslog-ng等软件通常用作syslog服务器。通过Syslog,可以集中记录和管理整个系统的日志信息,并帮助管理员监控系统的运行状态,解决问题并满足合规性要求。安全审计:通过安全审计shell脚本,可以详细记录用户在shell中的操作行为,包括执行的命令、时间戳、执行环境等信息,有助于跟踪用户的活动并在必要时进行调查和审计。同时,它还可以帮助识别潜在的入侵和未经授权的系统访问,并及时发现和处理安全威胁。
主要应用
服务器管理:作为系统管理员管理和配置服务器的重要工具,shell语言因其易用性和与Unix、Linux等系统的兼容性而备受青睐。通过编写shell脚本,管理员可以自动执行各种任务,简化日常操作并提高效率和准确性。无论是简单的文件操作还是复杂的系统管理,shell语言都为业务环境中的服务器管理提供了强有力的支持。
操作系统操作和维护:Shell脚本广泛应用于操作系统的运行和维护。中文操作系统通常是基于Linux内核的发行版,如麒麟、neokylin和红旗Linux。使用shell脚本编写一个监控脚本可以实时监控系统的运行状态,包括CPU利用率、内存占用、磁盘空间等。一旦发现异常情况,可以发送电子邮件或短信进行报警。国产操作系统通常使用RPM或DEB包管理工具,安装、卸载和更新软件包的脚本可以通过shell脚本编写,这简化了软件管理的过程。
任务自动化:shell语言的强大功能使用户可以轻松地自动化任务,包括文件和进程管理以及执行复杂的命令。其灵活的脚本和脚本能力使其广泛用于系统编程和管理。通过编写Shell脚本,用户可以简化重复性工作,提高效率,并确保任务的一致性和准确性。这使得shell语言成为系统管理员和开发人员不可或缺的工具,这大大简化了日常工作中的许多繁琐任务。