Linux的“壳”

简介: 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!   在上一篇文章中,我们已经初尝了Shell的好处。由于我们后面将大量借助Shell,所以在这里先简要介绍一下这件工具。

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

 

在上一篇文章中,我们已经初尝了Shell的好处。由于我们后面将大量借助Shell,所以在这里先简要介绍一下这件工具。

 

什么是Shell

我们已经说过,Shell是Unix系统提供的文本交互界面。你只需要用键盘来输入命令,就可以和操作系统交互。但这还是不够具体。说到底,Shell其实是一个运行着的程序。这个程序接收到你按下回车键之间的输入,就会对输入的文本进行分析。比如下面这个命令:

$free -h

包括空格在内总共7个字符。Shell程序会通过空格,区分出命令的不同部分。第一个部分是命令名。剩下的部分是选项和参数。在这个例子中,Shell会进一步分析第二个部分,发现这一部分的开头是"-"字符,从而知道它是一个选项。

 

有了命令名,Shell下一步就要执行该命令名对应的动作。这听起来就像是在戏剧舞台上,演员按照脚本演戏。Shell命令可以分为如下三类:

  • Shell内建函数(built-in function)
  • 可执行文件(executable file)
  • 别名(alias)

Shell的内建函数是保存在Shell内部的脚本。相对应的,可执行文件是保存在Shell之外的脚本。Shell必须在系统中找到对应命令名的可执行文件,才能正确执行。我们可以用绝对路径来告诉Shell可执行文件所在的位置。所谓路径,说明了一个文件在存储空间的位置:

/bin/date

date这个可执行文件位于根目录下的bin文件夹。

 

如果用户只是给出了命令名,而没有给出准确的位置,那么Shell必须自行搜索一些特殊的位置,也就是所谓的默认路径。Shell会执行第一个名字和命令名相同的可执行文件。这就相当于,Shell帮我们自动补齐了可执行文件的位置信息。我们可以通过which命令,来确定命令名对应的是哪个可执行文件:

$which date

 

别名是给某个命令一个简称,以后在Shell中就可以通过这个简称来调用对应的命令。在Shell中,我们可以用alias来定义别名:

$alias freak="free -h"

Shell会记住我们的别名定义。以后我在这个Shell中输入命令freak时,都将等价于输入free -h。

 

在Shell中,我们可以通过type命令来了解命令的类型。如果一个命令是可执行文件,那么type将打印出文件的路径。

$type date
$type pwd

总的来说,Shell就是根据空格和其他特殊符号,来让电脑理解并执行用户要求的动作。到了后面,我们还将看到Shell中其他的特殊符号。

 

Shell的选择

Shell是文本解释器程序的统称,所以包括了不止一种Shell。常见的Shell有sh、bash、ksh、rsh、csh等。在树莓派中,就安装了sh和bash两个Shell解释器。sh的全名是Bourne Shell。名字中的玻恩就是这个Shell的作者。而bash的全名是Bourne Again Shell。最开始在Unix系统中流行的是sh,而bash作为sh的改进版本,提供了更加丰富的功能。一般来说,都推荐使用bash作为默认的Shell。树莓派,以及其他Linux系统中广泛安装sh,都是出于兼容历史程序的目的。

 

我们可以通过下面的命令来查看当前的Shell类型:

$echo $SHELL

echo用于在终端打印出文本。而$是一个新的Shell特殊符号。它提示Shell,后面跟随的不是一般的文本,而是用于存储数据的变量。Shell会根据变量名找到真正的文本,替换到变量所在的位置。SHELL变量存储了当前使用的Shell的信息

 

你可以在bash中用sh命令启动sh,并可以用exit命令从中推出。

 

命令的选项和参数

我们已经看到,一行命令里还可以包含着选项和参数。总的来说,选项用于控制命令的行为,而参数说明了命令的作用对象。比如说: 

$uname -m

 

在上面的命令中,选项-m影响了命令uname的行为,导致uname输出了树莓派的CPU型号。如果不是该选项的影响,uname输出的将是"Linux"。我们不妨把每个命令看做多功能的瑞士军刀,而选项让命令在不同的功能间切换。由一个"-"引领一个英文字母,这成为短选项。多个短选项的字母可以合在一起,跟在同一个"-"后面。比如,下面的两个命令就等价:

$uname -m -r
$uname -mr

 

此外还有一种长选项,是用"--"引领一整个英文单词,比如:

$date --version

上面的命令将输出date程序的版本信息。

 

如果说选项控制了瑞士军刀的行为,那么参数就提供了瑞士军刀发挥用场的原材料。就拿echo这个命令来说,它能把字符打印到终端。它选择打印的对象,正是它的参数:

$echo hello

 

有的时候,选项也会携带变量,以便来说明选项行为的原材料。比如:

$sudo date --set="1999-01-01 08:00:00"

选项"--set"用于设置时间,用等号连接的,就是它的参数。date会把日期设置成这一变量所代表的日期。如果用短选项,那么就要用空格取代等号了:

$sudo date -s "1999-01-01 08:00:00"

值得注意的是,Shell对空格敏感。当一整个参数信息中包含了空格时,我们需要用引号把参数包裹起来,以便Shell能识别出这是一个整体。

 

需要注意,所谓的选项和参数提供给命令的附加信息。因此,命令最终会拿这些字符串做什么,是由命令自己决定的。因此,有时会发现一些特异的选项或参数用法。这个时候,你就要从文档中寻找答案。

 

 

如何了解一个陌生的命令?

每一个Linux系统都带有一套完善的文档,向你解释每个命令的用途。你可以用下面三个命令来调用某个命令的文档信息:

$whatis ls

whatis用很简短的一句话来介绍命令。

 

$man ls

man会返回命令的帮助手册对于大部分的Linux自带的命令来说,当作者编写它的时候,都会带有一个帮助文档,告诉用户怎么使用这个命令。man可以说是我们了解Linux最好的百科全书,它不但可以告诉你Linux自带的命令的功能,还可以查询Linux的系统文件和系统调用。如果想要深入学习Linux,就必须要懂得如何用man来查询相关文档。

 

$info ls

info将返回更详细的帮助信息

 

Shell的小窍门

1)命令补齐

大多数的Shell都有命令补齐的功能。当你在$的后面输入命令的一部分时,比如"dat"的时候,按Tab键,Linux会帮你打剩下的字符,补充成为"date"。这个过程中,Shell会搜索该命令名的所有可能。如果只有一种可能,那么Shell就会把该文件名补齐。如果不止一种,按第一次Tab会没有反应,按第二次Tab时,终端会打印出所有可能的命令名。比如输入"da",按两次Tab后,终端输出:

dash date

 

2)文件名补齐

不止是命令名,如果你输入的是作为参数的文件名,Linux也可以帮你补齐。比如说, 当前目录下有a.txt文件。当你输入到ls a.t的时候,按Tab键,Shell会帮你补齐该文件名,成为ls a.txt

 

3)历史命令

在Shell中,你还可以用向上箭头来查看之前输入运行的命令。你也可以用

$history

来查询之前输入的命令。

 

4)中止与暂停命令 

当一个命令运行时,你中途想要停止它时,可以用Ctrl + c。如果你只是想暂时停止,使用Ctrl + z。具体机制与信号(signal)有关,我们将在以后介绍

 

这一章中对Shell的介绍大多是围绕着命令进行。事实上,Shell还能一定程度的编程,从而组合功能单一的命令,完成更复杂的任务。我将在未来进一步探索Shell的这个方面。

 

总结

命令行: 使用Shell解释输入的字符串,以运行程序

type

echo, ls

sudo

which, whatis, man, info

使用Tab自动补齐,向上箭头查询历史,history

Ctrl + c, Ctrl + z

 

欢迎阅读“骑着企鹅采树莓”系列文章

目录
相关文章
|
Java Spring
IDEA中使用org.springframework.boot.autoconfigure.AutoConfiguration.imports没有被识别
IDEA中使用org.springframework.boot.autoconfigure.AutoConfiguration.imports没有被识别
1123 0
|
7月前
|
Ubuntu
在Ubuntu 20.04 x64系统中增加中文支持
将 Ubuntu 系统语言设置为中文: 1. 更新系统语言包: `sudo apt update` 和 `sudo apt install language-pack-zh-hans`。 2. 修改区域设置:编辑 `/etc/default/locale` 文件,设置 `LANG=zh_CN.UTF-8` 和 `LANGUAGE=zh_CN:zh`。 3. 生成中文 locale: `sudo locale-gen zh_CN.UTF-8` 和 `sudo update-locale`。 4. 重启系统: `sudo reboot`。 5. 验证设置: `locale` 命令检查是否生效。
531 1
|
10月前
|
存储 人工智能 运维
AI-Native的路要怎么走?一群技术“老炮儿”指明了方向
上世纪70年代,沃兹尼亚克、乔布斯等人成立Homebrew Computer Club,推动个人电脑普及。如今,创原会承袭这一精神,由CNCF执行董事Priyanka Sharma等构建,聚焦云原生和AI技术,汇聚各行业技术骨干,探索前沿科技。2024年创原会年度峰会达成“全面拥抱AI-Native”共识,解决算力与存储瓶颈,推动AI原生应用开发,助力千行万业智能化转型,成为行业创新风向标。
180 8
|
编解码 监控 API
直播源怎么调用api接口
调用直播源的API接口涉及开通服务、添加域名、获取API密钥、调用API接口、生成推流和拉流地址、配置直播源、开始直播、监控管理及停止直播等步骤。不同云服务平台的具体操作略有差异,但整体流程简单易懂。
|
前端开发 Java 程序员
【JAVA】<GUI编程>AWT & Swing 图形化编程库
【1月更文挑战第19天】【JAVA】<GUI编程>AWT & Swing 图形化编程库
|
应用服务中间件 网络架构
kodexplorer私有云本地部署,低成本内网穿透教程
可搭建:网站或个人博客;类似于某云的网盘;远程路由器(等家电)控制,内网的服务穿透至外网;迅雷远程下载;家庭云存储中心等。准备工作: 1、 可以插U盘的路由器(推荐二手小米mini,40包邮不能再多了) 2、 将路由器刷为最新的老毛子固件(参见恩山无线论坛) 3、 掏钱买VPS或者寻找一个免费的FRPS服务器 搭建步骤简述: 1、 路由器,联网,插U盘(事先格式化为EXT4格式,可以用diskgenius免费版)。
6947 1
|
算法 数据挖掘
点球成金:数据分析对抗传统经验的超级案例 | 彭文华
点球成金:数据分析对抗传统经验的超级案例 | 彭文华
|
Android开发 开发者 异构计算
【Android 性能优化】布局渲染优化 ( GPU 过度绘制优化总结 | CPU 渲染过程 | Layout Inspector 工具 | View Tree 分析 | 布局组件层级分析 )(一)
【Android 性能优化】布局渲染优化 ( GPU 过度绘制优化总结 | CPU 渲染过程 | Layout Inspector 工具 | View Tree 分析 | 布局组件层级分析 )(一)
591 0
【Android 性能优化】布局渲染优化 ( GPU 过度绘制优化总结 | CPU 渲染过程 | Layout Inspector 工具 | View Tree 分析 | 布局组件层级分析 )(一)
|
存储 缓存 数据处理
缓存与缓冲区的区别
在计算机科学中,缓存(Cache)和缓冲区(Buffer)是两个常见的概念。尽管它们的功能有些相似,但它们在实际应用中具有不同的用途和工作原理。本文将介绍缓存和缓冲区之间的区别。
991 0