![Linux操作系统管理与Hadoop生态圈部署:基于CentOS 7.6](https://wfqqreader-1252317822.image.myqcloud.com/cover/949/32517949/b_32517949.jpg)
3.1 Shell基础
本章将介绍Linux的Shell。通过本章的学习,读者会掌握Shell在Linux中的地位,以及如何选择、配置Shell,调出Shell的快捷方式,设置别名等。
3.1.1 什么是Shell
计算机硬件通常是由运算器、控制器、存储器、输入/输出设备等共同组成的,而管理整个计算机硬件的就是操作系统的内核(Kernel)。Linux内核负责完成硬件资源的分配、调度等管理任务。由于系统内核对计算机的正常运行十分重要,因此一般不允许直接操作内核,而是让用户通过基于系统调用接口开发出的程序或服务来管理计算机,以满足日常工作的需要,这个接口就是Shell。
Shell的中文含义是“外壳”,它就像包裹内核的一层外壳,对内保护内核,同时充当用户与内核(硬件)的沟通的角色。用户把一些命令“告诉”Shell,也就是运行Shell命令或Shell脚本,它就会调用相应的程序服务去完成某些工作。用户和内核进行交互的示意图如图3-1所示。
![](https://epubservercos.yuewen.com/1F99D7/17545851306442606/epubprivate/OEBPS/Images/39122_47_1.jpg?sign=1739299313-EWS0ZbBZyxbSOxxDn7hqdKdiZNyijtKI-0-ef07f23fa2c5691478760581220b564e)
图3-1 用户和内核进行交互的示意图
3.1.2 Linux Shell简介
Linux是一个开源项目,由多个组织机构共同开发。同时,不同的组织机构为了自己的开源软件或项目,可能会开发出功能类似的软件。这些软件各有优缺点,用户可以自由选择。Shell也是如此,不同的组织机构开发了不同的Shell,它们各有所长,有的占用资源少,有的支持高级编程功能,有的兼容性好,有的重视用户体验等。常见的Shell有sh、csh、tcsh、ash、nologin、zsh、bash等。
1.sh
sh的全称是Bourne Shell,由AT&T公司的Steve Bourne开发,并以他的名字命名。Bourne Shell是UNIX最初使用的Shell,并且在每种UNIX上都可以使用。Bourne Shell在Shell编程方面表现相当优秀,但在处理与用户的交互方面做得不如其他几种Shell。sh是第1个流行的Shell。
2.csh
在sh之后,另一个广为流传的Shell是由加州大学伯克利分校的Bill Joy设计的,这个Shell的语法有些类似于C语言,所以才得名为C Shell,简称为csh。其内部命令有52个,较为庞大。目前使用的并不多,已经被/bin/tcsh所取代。
3.tcsh
tcsh是csh的增强版,加入了命令补全功能,提供了更加强大的语法支持。
4.ash
ash是一个简单的、轻量级的Shell,占用资源少,适合运行于低内存环境,但是与下面要讲的bash完全兼容。
5.nologin
nologin指用户不能登录。
6.zsh
zsh是一个Linux用户很少使用的Shell,这是由于大多数Linux产品的安装默认使用bash。几乎每一款Linux产品都包含zsh,通常可以用apt-get、urpmi或YUM等软件包管理器进行安装。它有84个内部命令,使用起来也比较复杂。
7.bash
最后重点介绍bash,bash是Linux的默认Shell,本书也基于bash编写。bash由GNU组织开发,是Bourne Shell的扩展,与Bourne Shell兼容,并且在Bourne Shell的基础上增加、增强了很多特性,可以提供命令补全、命令编辑和命令历史等功能。它还包含了很多C Shell和Korn Shell的优点,有灵活和强大的编辑接口,还有很友好的用户界面。尽管如此,bash和sh还是有一些不同之处。
(1)bash扩展了一些命令和参数。
(2)bash并不完全和sh兼容,它们的有些行为并不一致,但在大多数企业运维的情况下区别不大,在特殊场景下可以使用bash代替sh。
Shell是一个程序,一般都放在/bin或/usr/bin目录下,当前Linux可用的Shell都记录在/etc/shells文件中。/etc/shells是一个纯文本文件,可以在图形界面下打开它,也可以使用cat命令查看它。
使用cat命令可以查看当前Linux的可用Shell,命令如下:
![](https://epubservercos.yuewen.com/1F99D7/17545851306442606/epubprivate/OEBPS/Images/39122_49_1.jpg?sign=1739299313-nA0GBMWTvF7q9TfhP6ij6OMFjhou6loX-0-e2fecfb9ffa8aae3174c8b20a9db08f9)
如果需要查看当前Linux的默认Shell,那么可以输出SHELL环境变量,命令如下:
![](https://epubservercos.yuewen.com/1F99D7/17545851306442606/epubprivate/OEBPS/Images/39122_49_2.jpg?sign=1739299313-6HvAaMruKjwXaYEGwrNGBvAFgciTE5Af-0-35aff2bce3e504d4d3639fb8b7db4742)
3.1.3 通配符与命令扩展
如果只知道一个文件名的其中几个字符,想遍历查出所有以这个关键词开头或包含这个关键词的文件,该怎么操作呢?Linux文件系统有各种各样的文件,经常会遇到需要搜索文件的情况。这时就可以使用通配符来完成。顾名思义,通配符就是通用的匹配信息的符号,下面列举一些常用通配符及其含义,如表3-1所示。
表3-1 常用通配符及其含义
![](https://epubservercos.yuewen.com/1F99D7/17545851306442606/epubprivate/OEBPS/Images/39122_49_3.jpg?sign=1739299313-te9CapcZ8RLtgrhrFlHiSBOdTbkeQ0IJ-0-c1bb6db932a88881e393515df24af05e)
例如:
![](https://epubservercos.yuewen.com/1F99D7/17545851306442606/epubprivate/OEBPS/Images/39122_49_4.jpg?sign=1739299313-xbQgQC314qGkblCdbj7Xkf28qGpsey0Y-0-5bf7f23d36d2ea5c844fc44294d8f7cc)
3.1.4 定制别名
在日常生活中,通常使用一些简短的语句和单词来表示大家都熟知的特殊的长句子。Linux也有类似的功能,使用alias命令可以将一段冗长的命令行简化成几个字母或数字的缩写。这样用户就不用每次都输入很多的字母和符号了,并且缩写完全是由自己设定的,非常的个性化,如果整理出一个简单的标准,则可以很好地提升控制台终端的工作效率。
执行alias命令,可以查看当前系统已经存在的别名,例如,下面的命令就是查看系统默认的别名:
![](https://epubservercos.yuewen.com/1F99D7/17545851306442606/epubprivate/OEBPS/Images/39122_50_1.jpg?sign=1739299313-jjhpvR3QM8Ia9gzrdnFrJSVozhEoWLDM-0-5cb298922f1f6a656ef48a9c53e7624b)
例如,alias ll='ls-l--color=auto',它表示“ll”是“ls-l”的别名,当在终端输入“ll”时,就相当于输入了“ls-l”。
配置别名使用alias命令,alias命令格式如下:
![](https://epubservercos.yuewen.com/1F99D7/17545851306442606/epubprivate/OEBPS/Images/39122_50_2.jpg?sign=1739299313-E5NSiwQGWkiVDqrHn7gHinUUYjVI23P9-0-5915468ad072420adfdbdeb46aa9108f)
例如:
![](https://epubservercos.yuewen.com/1F99D7/17545851306442606/epubprivate/OEBPS/Images/39122_50_3.jpg?sign=1739299313-cWUYi7IZYPOFKJLVFYQqmpv76NIoUPqg-0-6e220bca034dd890334c8bd146c944a3)
当不再需要别名时,可以使用unalias命令取消别名,格式如下:
![](https://epubservercos.yuewen.com/1F99D7/17545851306442606/epubprivate/OEBPS/Images/39122_50_4.jpg?sign=1739299313-2Ar3xiGNTgwBHwfMSf86NfvVq1lAq3Vo-0-d7a97babdc1e5beb0be878d4e67e0fed)
例如:
![](https://epubservercos.yuewen.com/1F99D7/17545851306442606/epubprivate/OEBPS/Images/39122_50_5.jpg?sign=1739299313-bpltJVA1GYyGVVHCqv7Gpd0RSHlVkkm0-0-c868b40b8bcdeda591b225e52506f563)
注意:通过alias命令配置别名的命令只对当前登录环境有效,只要退出当前登录,别名配置就会失效。如果希望别名配置永久生效,则需要把别名写入配置文件~/.bashrc中。在该文件末尾添加使用alias命令配置别名的命令,然后执行source/etc/bashrc命令,使配置生效。
3.1.5 转义字符与系统环境变量
Linux的很多字符有着特殊的意义,如果用户只想表达一个字符原来的意义,那么要怎么做呢?Linux提供了转义字符来处理输入的特殊数据,常见的转义字符及其含义如表3-2所示。
表3-2 常见的转义字符及其含义
![](https://epubservercos.yuewen.com/1F99D7/17545851306442606/epubprivate/OEBPS/Images/39122_51_1.jpg?sign=1739299313-xSW09dUm9q3QhDIXOMNPeUEgwh3DSh0j-0-9d2ea2c01155cee3d4b7721b51a13066)
注意:反引号“`”位于键盘左上角、数字1键的右方、Esc键的下方。在英文输入法下,直接按这个键,打出来的就是反引号。
下面以常见的$符号为例,帮助大家理解,$符号在Linux中是一个有着特殊意义的符号,如下所述。
$str 表示变量,可进行赋值等操作。
$0 表示脚本本身的名字。
$1 表示传递给该Shell脚本的第1个参数,$2表示第2个参数,以此类推。
$$ 表示脚本运行的当前进程ID号。
$?表示显示最后命令的退出状态,0表示没有错误,其他表示有错误。
例如:
![](https://epubservercos.yuewen.com/1F99D7/17545851306442606/epubprivate/OEBPS/Images/39122_51_2.jpg?sign=1739299313-49NFw6UPXgEb5B0HiSPcvP7lTYVs6bFg-0-120b8556cc8f6e39c4da9bbbd36d598c)
![](https://epubservercos.yuewen.com/1F99D7/17545851306442606/epubprivate/OEBPS/Images/39122_52_1.jpg?sign=1739299313-eAKYJnaMRBZYm36JS2IgKHbNj32MTjBN-0-8492382fcefb1318de8d89837612a0af)
其他几个转义字符的示例如下:
![](https://epubservercos.yuewen.com/1F99D7/17545851306442606/epubprivate/OEBPS/Images/39122_52_2.jpg?sign=1739299313-QPO7b9MPLdvLt5KQAlBrVH0S00BObb4q-0-ce595ed1164f0936731c01d2f65d95f0)
3.1.6 登录类型与用户环境配置
1.Shell的登录类型
Shell包括登录Shell和非登录Shell。
(1)登录Shell:需要用户名、密码登录后才能进入的Shell(或者通过--login选项生成的Shell)。
(2)非登录Shell:不需要输入用户名和密码即可打开的Shell。例如,直接使用bash命令,就是打开一个新的非登录Shell;在GNOME或KDE中打开的一个终端(terminal)窗口程序也是一个非登录Shell。
2.用户环境配置
变量是计算机系统用于保存可变值的数据类型。在Linux中,变量名称一般都是大写的,这是一种约定俗成的规范。用户可以直接通过变量名称来提取对应的变量值。Linux中的环境变量是用来定义系统运行环境的一些参数,如每个用户不同的家目录、默认文件的权限、邮件存放位置、命令搜寻路径等。
配置环境有以下3种方法。
1)直接使用export命令
命令格式如下:
![](https://epubservercos.yuewen.com/1F99D7/17545851306442606/epubprivate/OEBPS/Images/39122_52_3.jpg?sign=1739299313-SwRckIFdwTmmQyD4wDerzv1f3MX29lH4-0-cb4dbe291c13db55efc7806b69926896)
例如,用户需要加入自己的MySQL命令目录,命令如下:
![](https://epubservercos.yuewen.com/1F99D7/17545851306442606/epubprivate/OEBPS/Images/39122_52_4.jpg?sign=1739299313-ha78veG8AxcYzDop6Bosa3r6RYM97BXJ-0-1affc3cabbbb38289fda2f87aaabfe2e)
![](https://epubservercos.yuewen.com/1F99D7/17545851306442606/epubprivate/OEBPS/Images/39122_53_1.jpg?sign=1739299313-43rqheQ4MEOjrckitOWPuY6LTlOh3Rl5-0-f084fff8d4c46b6fc747976b55fb9517)
直接使用export命令设置的变量都是临时变量,也就是说,如果退出当前的Shell,为该变量定义的值就不会生效了。如何让定义的变量永久生效呢?那就使用第2种定义方式。
2)修改配置文件/etc/profile
编辑配置文件/etc/profile,在配置文件中加入如下配置语句:
![](https://epubservercos.yuewen.com/1F99D7/17545851306442606/epubprivate/OEBPS/Images/39122_53_2.jpg?sign=1739299313-pEdJmcCKGPWeYs1oQEOt7mueGoKcXT1i-0-6e556bd59a41301119afbfd1e24b3fcd)
在修改完这个文件后使用source命令,可以在不用重启系统的情况下使修改的内容生效;或者使用.命令使配置文件生效,等同于source命令。例如:
![](https://epubservercos.yuewen.com/1F99D7/17545851306442606/epubprivate/OEBPS/Images/39122_53_3.jpg?sign=1739299313-yDw5cGN3WVGaut0UnAX2bAsabRkUmMlj-0-90deceec83c57bb8c4523067a39917ca)
3)修改配置文件/root/.bashrc,在当前的Shell下生效
编辑配置文件/root/.bashrc,在配置文件中加入如下配置语句,修改环境变量:
![](https://epubservercos.yuewen.com/1F99D7/17545851306442606/epubprivate/OEBPS/Images/39122_53_4.jpg?sign=1739299313-DqC5jdTKUgnKqOGUjzXuCqBhOADyfXix-0-c11187c65994c10dba3f2493afb9407f)
或者在配置文件/root/.bashrc中加入如下配置语句,使别名对当前的Shell生效:
![](https://epubservercos.yuewen.com/1F99D7/17545851306442606/epubprivate/OEBPS/Images/39122_53_5.jpg?sign=1739299313-0B8fUSanf7YKWM1meTj34mPswCneYcz8-0-349ffa3d8e2b94ce208c6d223a3a9ebb)
当然,在修改这个文件之后,记得要使用source命令或者.命令使配置文件生效。