一、什么是Shell?
感觉挺高大上的,其实就是个“壳子”啦,或者是一座桥!
我们向系统输入的信息是要送到内核去的,而Shell 就负责接收用户输入的命令并把它送入内核中执行。
二、Shell的功能
1. 命令解释器
Shell 提供给用户与内核进行交互的这个接口叫做命令解释器,这是Shell 最重要的功能。
首先了解一下什么是Shell命令:http://www.360doc.com/content/11/0418/14/54470_110503260.shtml
Linux系统中所有可执行文件都可以作为Shell命令来执行,参考→https://zhidao.baidu.com/question/814197434639245972.html
Linux的可执行文件有一下几种类型:
类别 | 说明 |
Linux命令 | 存放在/bin、/sbin目录下的命令 |
内置命令 |
处于效率的考虑,将一些常用的命令的解释程序构造在Shell内部 |
实用程序 | 存放在/usr/bin、/usr/sbin、/usrlocal/bin、/usr/local/sbin等目录下的实用程序 |
用户程序 | 用户程序经过编译生成可执行文件后可作为Shell命令运行 |
Shell脚本 | 由Shell语言编写的批处理文件 |
Shell完成命令解释过程:当用户向Shell提交了一个命令后,Shell会判断这个命令是不是内置命令,如果是内置命令,命令解释器就会将这个命令解释为系统功能调用并转交给内核去执行;如果不是的话,就试图在硬盘中查找该命令并将其调入内存,之后再将命令解释为系统功能呢个调用并转交给内核执行。
在查找该命令时,会分为两种情况:
(1)如果用户给出了命令的路径,Shell就会沿着用户给出的路径进行查找,如果找到了就调入内存,否则输出提示信息;
(2)如果用户没有给出命令的路径,Shell就在环境变量PATH所制定的路径中依次进行查找,如果找到了就调入内存,否则输出提示信息。
3、Shell的主要版本
版本 | 说明 |
Bourne-Again Shell(简称:bash、bsh) | bash是大多数Linux系统默认的Shell。 bash和bsh完全向后兼容,并且在bsh的基础上增加和增强了很多特性。 bash也包括很多C Shell和Korn Shell中的优点。 bash有很灵活和强大的编程接口,同时又有很友好的用户界面。 |
Korn Shell(简称ksh) | 是Unix系统上标准的Shell。 在Linux下,专门的ksh的扩展版本:Public Korn Shell (pdksh) |
tcsh(csh的扩展) | tcsh和csh完全向后兼容。 它包含了更多使用户感到方便的特性,最大的提高是在命令行编辑和历史浏览方面。 |
4、Shell元字符(Shell metacharacter)
在Shell中有一些具有特殊意义的字符,这些字符就称为元字符。如果不以特殊方式指明他们,Shell就不会把它们当做普通文字符号使用。比如:
元字符 | 含义 |
* | 代表任意字符串 |
? | 代表任意字符 |
/ | 代表根目录或作为途径间隔符使用 |
\ | 转义字符,当命令的参数要用到保留字时,要在保留字前面加上转义字符 |
\ |
续行符,可以使用续行符将一个命令分写在多行上 |
$ | 变量值置换,如$PATH表示环境变量PATH的值 |
' | 在'...'中间的字符均当做文字处理,指令、文件名、保留字不再具有原来的意义 |
" | 在"..."中间的字符均当做文字处理并允许变量值置换 |
` | 命令替换,置换`...`中命令的执行结果 |
< | 输入重定向字符 |
> | 输出重定向字符 |
| | 管道字符 |
& | 后台执行符。在一个命令前加上&,该命令就会以后台方式执行 |
; | 分割顺序执行的多个命令 |
() | 在子Shell中执行一组命令 |
{} | 在当前Shell中执行一组命令 |
! | 执行命令历史记录中的命令 |
~ | 代表登录用户的宿主用户(自家目录) |
5、命令格式
Shell命令的一般格式为:cmd(命令名) [-options(选项)] [arguments(参数,即操作对象)]
比如:
$ ls $ ls -lra /home $ cat /etc/passwd ./myfile
具有以上格式的字符串习惯地成为称为命令行,命令行是用户与Shell之间对话的基本单位。
说明:
>>>最简单的Shell命令只有命令名,复杂的Shell命令可以有多个选项和参数。
>>>选项和参数都作为Shell命令执行时的输入,它们之间用空格分隔开。
>>>单字符参数前使用一个减号(-),单词参数前使用两个减号(--),多个单字符参数前可以只使用一个减号。
>>>操作对象(arguments)可以是文件也可以是目录,有些命令必须使用多个操作对象, 如cp命令必须指定源操作对象和目标操作对象。
>>>并非所有命令的格式都遵从以上规则,例如dd、find等
Linux中的常用命令有:
cat | 查看文件内容 | more/less | 查看文件内容 |
cd | 切换工作目录 | touch | 改变文件的时间属性 |
chown | 改变文件属权 | mv | 改名或移动文件 |
chmod | 改变文件权限 | pwd | 显示当前所在的目录 |
clear | 清除屏幕 | rm | 删除文件或目录 |
cp | 拷贝文件 | find | 查找文件 |
ln | 创建文件链接 | which | 寻找命令 |
ls | 显示目录内容 | tar | 文件打包 |
mkdir | 创建目录 | [g]zip | 文件压缩 |
rmdir | 删除目录 | unzip/7za | 文件解压 |
6、目录和文件名的命名规则
命名规则:
>>>除了"/"外,所有的字符都合法;
>>>有些字符最好不要用,比如空格符、制表符、退格符和字符:?,@,#,$,&,(),\,|;‘,’,“,”,<>等;
>>>避免使用“+”,“-”或“.”来作为普通文件名的第一个字符;
>>>大小写敏感;
>>>以“.”开头的文件都是隐含的。
7、通配符
通配符是我们喜欢的一种符号,它为我们描述目录或者文件提供了捷径。
常用的通配符有:
通配符 | 说明 |
* | 匹配任何数目的字符,即字符串 |
? | 匹配任何单字符 |
[...] | 匹配任何包含在括号里的单字符 |
[!...] | 匹配任何不包含在括号里的单字符 |
注意:“.”能够匹配文件或目录名中的,但不能匹配首字符是“.”的隐含文件或目录名。如果要匹配,就要用“.*”。
举例:
8、文件
在Linux系统上,文件被看作是字节序列。对系统资源进行访问和处理就是通过字节序列的方式实现的。
Linux系统下的文件类型包括:
8.1 普通文件
普通文件就是字节序列,可以是程序源代码(C、C++,python等),可执行文件(文本编辑器、数据库系统、出版工具、绘图工具等)、图片、声音、图像等。Linux 不会区别对待这些普通文件,只有处理这些文件的应用程序才会根据文件的内容赋予相应的含义。
在Linux环境下,只要是可执行的文件并具有可执行属性它就能执行,不管其文件名后缀是什么。但是对一些数据文件一般也遵循一些文件名后缀规则。
小结:从上面了解到普通文件占据了Linux系统中大多数,其中包含了各种类型:图片、压缩文件、shell脚本、python文件等等,Linux系统下的文件后缀名并不表明文件是否可执行,后缀用户标识应用程序类型,但是与可执行性无关,可执行与否取决于文件权限。
8.2 目录和硬链接
目录文件是由一组目录项组成,目录项可以是对其他文件的指向,也可以是其下的子目录指向。https://zhidao.baidu.com/question/535854862.html
实际上,一个文件的名称是存储在父目录中,而并非和文件内容本身储存在一起。
将两个文件名(存储在其父目录的目录项中)指向硬盘上一个存储空间,对这两个文件中的任何一个的内容
进行修改都会影响到另一个文件,这种链接关系叫做硬链接,
硬链接文件实际上就是在某目录中创建目录项,从而使不止一个目录可以引用到同一个文件。
它可以由ln建立:
ln <被链接的文件> <链接文件名>
该命令产生一个新的文件,和以前存在的文件建立起链接关系。
注意:建立起来的硬链接文件和原来的文件大小和内容都相同,原来的文件的链接数为1,表示只有一个目录项指向这块存储空间,而加一个链接文件,指向这块存储空间的目录项就会加1,因此链接数也会加1,如果删除了其中哪一个文件(不管是原文件还是链接文件),只是删除了该文件对这块存储空间的指向关系,并不会使这块存储空间释放,也不会影响其他目录项,但是存储空间对应的链接数就会减1,当链接数为0时,这块存储空间便会释放。
硬链接并不是一种特殊类型的文件,只是在同一个文件系统中允许多个目录项指向同一块存储空间的机制。
8.3 符号链接(软链接)
符号链接是指将一个文件指向另一个文件的文件名。这种符号连接关系有ln -s命令建立,比如:
ln -s file1 file2
和硬链接不同,建立的软链接文件是指向原文件而不是存储空间,而且软链接为大小也比原文件小得多,因为他只记录了要指向的文件名而已,相当于指针。
当用cat命令访问file2时,发现file2是一个符号链接,便会根据file2找到file1,然后将file1中的内容显示出来。
因此,指向存储空间的目录项还是只有file1,因此链接数还是1。
如果删除file2,file1不会有影响,但如果删除file1,file2将无法再被找到,变成了死链接。
https://www.bilibili.com/video/BV1vT4y1g7b8?from=search&seid=907312274253724591
8.4 设备文件
这里的设备指计算机中的外围硬件装置,即除了CPU和内存以外的所有设备。
在 Linux 下,为了屏蔽用户对设备访问的复杂性,采用了设备文件,即可以通过象访问普通文件一样的方式来对设备进行访问读写。
设备文件用来访问硬件设备,包括硬盘、光驱、打印机等。每个硬件设备至少与一个设备文件相关联。
Linux设备文件分为字符设备(如键盘)和块设备(如磁盘)。所有的设备文件都存放在/dev目录下。
其中有两种特殊的设备文件:
设备文件 | 说明 |
/dev/null | 空设备。可将其视为黑洞,所有写入它的内容将会丢失,通常用于屏蔽命令行输出。 |
/dev/zero | 零设备。可以产生连续不断的二进制零流。通常用于创建制定长度的空文件 |
8.5 套接字和命名管道
套接字和命名管道是 Linux 环境下实现进程间通信(IPC)(Interprocess communication)的机制,是在进程运行时创建或删除的,一般无需系统管理员干预。
9 熟悉Linux目录结构
Linux的目录结构遵从文件系统层次结构标准(File system Hierarchy Standard,FHS)。
目录树的结构>
文件系统结构从一个根目录开始,根目录下可以有任意多个文件和子目录。
https://linux.cn/article-9798-1.html?pr