文章目录
Linux介绍
Linux是一种开源的类Unix操作系统,最初由芬兰的Linus Torvalds于1991年发布。Linux内核是操作系统的核心,负责管理系统资源和硬件,它可以安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、台式计算机等。
Linux特点
- 开源和自由软件: Linux内核和大多数Linux发行版都是根据GNU通用公共许可证(GPL)发布的,这意味着用户可以自由使用、修改和分发
- 稳定和安全: Linux以其稳定性和安全性著称,适用于服务器环境和需要高可靠性的应用程序
- 多用户和多任务: Linux支持多个用户同时使用,并能够同时运行多个任务(进程)
- 强大的网络功能: Linux具有强大的网络功能,广泛用于服务器、路由器、防火墙等网络设备
- 灵活和可定制: 用户可以根据需要定制Linux系统,选择合适的内核、软件包和桌面环境
Shell
概述
Shell是Linux系统下的命令解释器,负责将用户输入的命令转换为计算机可识别的指令。Shell不仅允许用户直接输入命令来操作计算机,还支持通过编写脚本来批量处理命令。Shell不仅提供了丰富的命令行工具,还支持脚本编写,使得系统管理和自动化任务变得更加高效。
Shell的特性与优势
命令解释: Shell能够解释用户输入的命令,并将其转换为操作系统内核可以理解的指令。这使得用户可以通过简单的命令来控制系统和应用程序。
脚本编程: Shell支持脚本编程,允许用户将一系列的命令组合成一个脚本文件,通过执行脚本来自动化复杂的任务。Shell脚本具有易编写、易调试、易移植等优点。
环境变量: Shell支持环境变量的设置和读取,环境变量可以存储系统配置信息、用户偏好设置等,方便用户在不同场景下的使用。
命令补全与历史记录: 许多Shell都提供了命令补全和历史记录功能,这些功能可以提高用户的工作效率,减少命令输入的错误。
灵活性与可定制性: Shell提供了丰富的配置选项和工具,用户可以根据自己的需求定制Shell的行为和外观。此外,Shell还允许用户通过编写自定义函数和别名来扩展其功能。
简单来说,它是Linux系统中运行的一种特殊程序,在用户和内核之间充当“翻译官”。用户登录Linux系统时,自动加载一个SheII程序,Bash就是Linux系统中默认使用的ShelI程序
用户与系统之间的沟通
从内核态和用户态的角度来看,用户与系统之间的沟通方式主要通过系统调用来实现。用户态和内核态是操作系统中的两个重要概念,它们定义了应用程序和操作系统之间的交互方式。
用户态与内核态概述
- 用户态(User Mode):用户态是运行用户程序的状态,其权限受到限制。在这种模式下,应用程序拥有有限的系统资源访问权限,只能在操作系统划定的特定空间内运行。用户态下运行的程序不能直接访问硬件设备或执行特权指令,所有对硬件的访问都必须通过操作系统进行。
- 内核态(Kernel Mode):内核态是运行操作系统程序、操作硬件的状态,具有最高权限。处于内核态的CPU可以执行所有的指令,访问所有的内存地址,拥有最高的权限。内核态下运行的程序可以访问系统的所有资源,包括CPU、内存、I/O等。在内核态下,操作系统可以响应所有的中断请求,处理硬件事件和系统调用。
沟通方式:系统调用
用户态与内核态之间的主要沟通方式是通过系统调用(System Call)实现的。系统调用是一种特殊的函数调用,它允许运行在用户态的程序请求操作系统内核执行某些特权操作。当用户程序需要操作系统帮助完成某些它没有权力和能力完成的工作时(如文件操作、网络通信等),就会通过系统调用陷入到内核态,由操作系统来完成相应的工作。
系统调用的过程
- 发起系统调用: 用户态下的程序通过特定的方式(如使用中断指令或陷阱指令)发起系统调用,将控制权交给操作系统内核。
- 保存上下文: 操作系统内核在接收到系统调用请求后,会保存当前用户态程序的上下文(如CPU寄存器状态、程序计数器等),以便在系统调用完成后恢复执行。
- 执行内核代码: 进入内核态后,操作系统内核执行相应的系统调用处理函数,完成用户请求的操作。
- 恢复上下文: 系统调用完成后,操作系统内核将控制权返回给用户态程序,并恢复之前保存的上下文,以便用户态程序继续执行。
系统区分用户态和内核态的主要原因:
安全性: 将操作系统和用户程序的运行环境分开有助于防止用户程序对系统造成不可修复的破坏。用户程序在用户态下运行,受到严格的限制,不能直接操作关键系统资源。
稳定性: 如果一个用户程序崩溃或出现错误,它不会影响整个系统的稳定性。内核态下运行的操作系统可以继续正常工作,而不受用户程序的干扰。
性能: 内核态具有更高的权限,可以执行一些需要较高特权级别的操作,如直接访问硬件。将这些操作限制在内核态有助于提高系统的性能,因为不需要为每个用户程序都提供相同的权限。
综上所述,用户态和内核态是操作系统的两个重要概念,它们定义了应用程序和操作系统之间的交互方式。通过将应用程序运行在用户态,而将操作系统核心功能运行在内核态,可以实现对硬件资源的有效管理和保护,提高系统的稳定性和安全性。
Linux常用指令基础
Linux命令的分类
内部命令 | 外部命令 |
---|---|
集成于Shell解释器程序内部的一些特殊指令也称为内建(Built-in)指令 | Linux系统中能够完成特定功能的脚本文件或二进制程序 |
属于Shell的一部分 | 属于Shell解释器程序之外的命令 |
没有单独对应的系统文件 | 每个外部命令对应了系统中的一个文件 |
自动载入内存,可以直接使用 | 必须知道其对应的文件位置,由Shell加载后才能执行/bin,/usr/bin,/usr/local/bin等 |
Linux命令行的格式
基础格式
命令字 [选项] [参数]——( 英文字符区分大小写)
- 命令字
是整条命令中最关键的一部分
唯一确定一条命令 - 选项——(多个单字符选项可以组合在一起使用)
符号引导
短格式选项:使用"-“符号引导
长格式选项:使用”–"符号引导 - 参数
命令字的处理对象
可以是文件名、目录(路径)名或用户名等内容
个数可以是零到多个
格式 | 含义 |
---|---|
命令 | 定义的基本功能 |
选项 | 添加的扩展功能 |
参数 | 功能的操作/执行对象 |
辅助操作
- Tab 键:自动补齐
- 反斜杠“\”:强制换行
- Ctr+U组合键:清空至行首
- Ctr+K组合键:清空至行尾
- Ctr+L组合键:清屏
- Ctrl+C组合键:取消本次命令编辑
- Ctrl+a组合键:切换到行首
- Ctrl+e组合键:切换到行尾
获得命令帮助的方法
- 内部命令 help
●查看Shell内部命令的帮助信息 - 命令的“–help”选项
●适用于大多数Linux外部命令 - 使用man命令阅读手册页
●使用“↑”、“↓”(ENTER)方向键滚动一行文本
●使用 Page Up 和 Page Down(空格)键翻页
●按 Q 或 q键退出阅读环境
●按“/”键查找内容,n键向下查找,N键向上查找
Linux的常用命令
命令 | 含义 |
---|---|
pwd | 查看当前所在目录 |
cd 目标位置 | 切换到目标位置 |
cd~/cd | 若不指定目标位置,切换到当前用户的宿主目录 |
cd - | 切换到上一次执行 cd 命令之前所在的目录 |
alias 命令别名=命令 | 设置别名 |
ls-用于列出目录中的文件和子目录
用主要于列出目录中的文件和子目录。通过不同的选项,可以控制输出的格式和内容。
- 基本语法:
ls [选项] [目录]
选项 | 描述 |
---|---|
-l | 以长格式(包括文件权限、所有者、大小、最后修改时间等详细信息)显示文件列表。 |
-a | 显示所有文件,包括隐藏文件(以. 开头的文件)。 |
-A | 显示除了. 和.. 之外的所有文件,包括隐藏文件。 |
-h | 与-l 结合使用时,以人类可读的格式显示文件大小(例如,1K、234M、2G等)。 |
-S | 根据文件大小进行排序,最大的文件排在最前面。 |
-t | 根据文件最后修改时间进行排序,最近修改的文件排在最前面。 |
-r | 反向排序,即按照降序排列。 |
-R | 递归地显示子目录中的文件。 |
-i | 显示文件和目录的inode号。 |
–color | 在字符模式中以颜色区分不同的文件。 |
-d | 显示目录(Directory)本身的属性,而不是显示目录中的内容。 |
- 示例:
列出当前目录下的所有文件和子目录:
ls
以长格式显示当前目录下的所有文件和子目录:
ls -l
显示当前目录下的所有文件,包括隐藏文件:
ls -a
以人类可读的格式显示当前目录下的文件大小:
ls -lh
根据文件大小进行排序并显示:
ls -S
递归地显示子目录中的文件:
ls -R
注意:ls是的选项是可以拥有并列项的
touch-主要用于创建新的空文件
指令是Linux和Unix系统中一个常用的命令,主要用于创建新的空文件或更改现有文件的时间戳(包括访问时间和修改时间)。
- 基本语法:
touch [选项] 文件名
选项 | 描述 |
---|---|
-a | 只修改访问时间 |
-c, | –no-create 如果文件不存在,不创建新文件 |
-d, --date | 使用日期字符串修改时间戳 |
-m | 只修改修改时间 |
-r, --reference | 将时间戳更改为参考文件的时间戳 |
-t | 修改时间戳,其中时间戳是日期/时间格式 |
- 示例:
创建文件
最简单的使用touch命令的方式是不带任何选项:
touch filename
如果文件不存在,touch会创建该文件。如果文件已经存在,touch会将时间戳更改为当前时间。
创建多个文件
touch命令也可以一次创建多个文件。要做到这一点,只需列出文件名,文件名之间用空格分隔:
touch filename1 filename2
更改现有文件的访问时间和修改时间:
touch -a -m -t 202201010000.00 file.txt
如果文件不存在,则不创建新文件:
touch -c non_existent_file.txt
将文件的访问时间和修改时间设置为另一文件的相应时间:
touch -r reference_file.txt target_file.txt
du(Disk Usage)-用于估算文件和目录占用的磁盘空间
命令用于估算文件和目录占用的磁盘空间。它可以显示每个文件或目录及其子目录的磁盘使用情况。
- 基本语法:
du [选项][文件或目录... ]
选项 | 描述 |
---|---|
du [选项][文件或目录… ] | 统计指定目录(或文件)所占用磁盘空间的大小 |
du -a | 统计磁盘空间占用时包括所有的文件,而不仅仅只统计目录 |
du -h | 以更人性化的方式(默认以KB计数,但不显示单位)显示出统计结果 |
du -s | 只统计所占用空间总的大小,而不是统计每个子目录、文件的大小 |
du --max-depth=n | 统计所有小于等于第 n层的目录的总大小 |
- 示例
显示当前目录下所有文件和子目录的大小:
du -ah .
显示当前目录下所有文件和子目录的总大小:
du -sh .
显示指定目录下所有文件和子目录的大小,深度为1:
du -h --max-depth=1 /path/to/directory
常用通配符
在Linux和类Unix系统中,通配符(wildcards)被用于命令行中,以便匹配文件名或路径的一部分。
以下是一些常用的通配符:
*
:匹配任意长度的字符序列。例如,*.txt
会匹配所有以 .txt 结尾的文件。?
:匹配单个字符。例如,file?.txt
会匹配像 file1.txt 或 file2.txt 这样的文件,但不会匹配 file12.txt。[...]
:匹配方括号内的任意一个字符。例如,file[12].txt
会匹配 file1.txt 或 file2.txt,但不会匹配 file3.txt。你还可以使用范围,如file[1-3].txt
会匹配 file1.txt、file2.txt 和 file3.txt。[^...]
:匹配不在方括号内的任意字符。例如,file[^12].txt
会匹配除了 file1.txt 和 file2.txt 之外的所有 .txt 文件。**{...}
:匹配大括号内的任意一个字符串。例如,file{1,2}.txt
会匹配 file1.txt 和 file2.txt。-
:匹配连字符本身或在字符范围的开头和结尾。例如,[-a-z]
会匹配任何小写字母和连字符 -。.
:匹配文件名中的点.。
通常需要转义,即\.,
以避免被解释为正则表达式中的特殊字符。
请注意,通配符在命令行中主要用于文件名匹配,而不是文件内容的搜索。如果你需要在文件内容中搜索特定的模式,应该使用 grep 或其他文本搜索工具。
补充:
简析ls -l的输出结果
ls -l
命令在 Linux 或 Unix 系统中用于列出当前目录下文件和目录的详细信息。
ls -l
输出结果的格式示例
(注意:这个示例是基于假设的,因为实际输出将取决于你的系统环境、当前目录下的文件和目录以及它们的属性。)
total 24
drwxr-xr-x 4 user group 4096 Mar 12 10:00 Documents
-rw-r--r-- 1 user group 220 Mar 12 09:55 example.txt
-rw-r--r-- 1 user group 1024 Mar 11 15:30 file.log
drwxr-xr-x 3 user group 4096 Mar 10 14:45 Pictures
-rw-r--r-- 1 user group 32 Mar 12 10:05 readme.md
lrwxrwxrwx 1 user group 9 Mar 12 10:10 symlink -> /etc/hosts
- 这个示例输出包含以下信息:
total 24
:这一行显示了当前目录下所有文件和目录所占用的总块数(block count),但请注意,这个值在不同的系统和文件系统上可能有不同的含义和精度。 - 接下来的每行代表一个文件或目录的详细信息:
- 第一个字段(如
drwxr-xr-x
或-rw-r--r--
)是文件属性字,包含了文件类型(如d
表示目录,-
表示普通文件,l
表示软链接)和权限(如读r
、写w
、执行x
)。 - 第二个字段是硬链接数
- 第三个字段是文件或目录的所有者用户名。
- 第四个字段是文件或目录所属的用户组名。
- 第五个字段是文件大小,以字节为单位。
- 第六个字段是文件的最后修改时间,格式为“月 日 时:分”。
- 最后一个字段是文件或目录名。
- 第一个字段(如
该示例中,Documents
表示目录,example.txt
和 file.log
表示普通文件,Pictures
表示另一个目录,readme.md
表示另一个普通文件,而 symlink
表示一个指向 /etc/hosts
的软链接。
新建的文件默认是不带执行权限的
新建的目录是有执行权限的
绝对路径和相对路径
- 绝对路径:
从文件系统的根目录开始,完整地描述到目标文件或目录的路径。它提供了到达指定文件或目录的确切位置,不依赖于当前工作目录。 - 相对路径:
基于当前工作目录,描述到目标文件或目录的路径。它只提供了从当前位置到目标位置的相对方向,而不是从文件系统根目录开始的完整路径。
表达形式 | 含义 | 示例(假设当前目录为/home/user/docs ) |
---|---|---|
. | 表示当前目录 | 访问当前目录下的file.txt :./file.txt |
.. | 表示上一级目录(父目录) | 访问上一级目录下的images 文件夹:../images/ |
文件名 | 直接在当前目录下查找文件或目录 | 访问当前目录下的report.pdf :report.pdf |
子目录/文件名 | 在当前目录下的指定子目录中查找文件或目录 | 访问projects 子目录下的project1.docx :projects/project1.docx |
../父目录中的文件或目录 | 向上回退一级后,再指定路径访问文件或目录 | 访问上一级目录中的notes 文件夹下的note.md :../notes/note.md |
./当前目录下的子目录/文件名 | 当前目录下,指定子目录中的文件或目录(实际上. 可以省略) | 访问当前目录下的archive 子目录中的old_file.txt :./archive/old_file.txt 或 archive/old_file.txt |
../../上两级目录中的文件或目录 | 向上回退两级后,再指定路径访问文件或目录 | 访问上两级目录中的backup 文件夹下的data.zip :../../backup/data.zip |