基本指令
约 27698 字大约 92 分钟
2025-04-11
1.操作系统的作用
用户通过使用操作系统,借用操作系统的手,来间接操作各种硬件的驱动程序,每个驱动程序就会调用各自相匹配硬件。
例如在 Windows
中,用户使用鼠标打开计算器软件进行加减乘除,这个程序的内部最终会变成二进制的指令,交给 CPU
去执行,但是是谁交给 CPU
的呢?就是通过操作系统的手。
而在 Linux
中,用户一般不会使用鼠标来完成上述的工作,而是在一个黑框框/控制台中,直接使用键盘输入指令,指令就可以交给操作系统进行进一步的执行,因此学习 Linux
的第一步,就是学习在控制台中使用指令,并且可以达到在 Windows
中一样的操作。

上图为 Windows
下创建目录的鼠标步骤。

上图为 Linux
下创建目录的键盘步骤。

上图为 Windows
下创建打开文件并且编辑的鼠标步骤。

上图为 Linux
下打开文件并且编辑的键盘步骤。
可以看到,Windows
下有的,Linux
也有,只不过操作方式不一样罢了(一种是使用图形化界面也就是 GUI
来进行操作,一种是使用 Bash
这种命令行控制台来进行操作)。也就是说,用户一定可以通过一些方式来指挥操作系统,每一条指令的背后实际都是对操作系统提供的系统调用的封装(这点我们以后会提及),最终通过各种中间层来调用硬件。
为什么学习 Linux
而不深入学习 Windows
的使用呢?理由如下:
Linux
能让您更好理解操作系统的原理Linxu
的指令其实要比Windows
的鼠标点击和GUI
图形界面在有些时候更加直观Linux
更适合作为服务器,但是Windows
很难承担这份重任...
因此 Linux
是最适合程序员使用的操作系统且没有之一。
2.Linux 图形界面
不过其实 Linux
也有图形化界面,但您在前期学习时一定要舍弃类似 Xwindow
这样的图形化界面,坚持使用命令行来操作 Linux
系统。Xwindow
是 Centos
中的界面,其实就是 Centos
中的一款软件,让 Linux
的也可以像 Windows
一样使用图形化界面来操控系统(而 Ubuntu
默认使用 GNOME
)。


而这里提到的命令行,就是 bash
指令被输入的环境,我们先来学习一下常见的 bash
指令,并且尝试进行使用。
警告
警告:由于作者本人混合使用 CentOS系列
和 Ubuntu系列
的操作系统,所以有些时候某些指令需要转化一下,您可以使用 Ai
来进行辅助,最典型的就是:这两个操作系统的安装包不一样,例如 CentOS系列
的使用 yam
安装软件,而 Ubuntu系列
使用 apt
安装软件。
3.bash 的指令操作
bush
实际上就是个类似 Windows
下“命令提示符”的软件,可以输入指令来和操作系统进行交互。
重要
补充:Windows
下的命令提示符可以使用快捷键 [win + R]
后键入 cmd
回车来打开。
Linux
的指令是不需要强行记忆的,对于经常使用的指令只要“敲多了”就会自然记下,对于不经常使用的指令,能够知道且检索到该指令的具体用法即可。
一般来说,bash
下的 shell
命令形式为 command [-options] parameter1 parameter2 ...
command
:具体的指令名称[-options]
:可选项,通常以-
开头,以缩写字母为参数(-p
),也有的参数可以使用--
然后使用完整的参数名称(--help
),通常 用来控制某些行为parameter
:命令需要使用到的一些参数
shell
命令中,命令、参数、选项都要使用至少一个空格分割。而当一条 shell
命令过长时,可以借助 \
然后回车做换行,只有在最后一次回车时才会被整条执行。
警告
警告:接下来,我将带您使用 VM
虚拟机的 Centos7
系统,尝试使用大量的指令来教会您使用操作系统,指令很多,看不懂就跳过(以后再回头来看),有一些指令是需要其他的知识才能彻底理解的,请别丧失信心。
所有的指令的操作都在 VM
虚拟机中进行,因此我推荐您使用 Centos7
的桌面版本,并且如下打开终端来输入指令。

3.1.文件操作指令
由于在 Linux
中,”文件“=”文件的内容+文件的属性“,因此对于文件的操作无非就分为:
对文件的内容的操作
对文件的属性的操作
因此下面的指令几乎不是在操作文件的内容就是在操作文件的属性。
3.1.1.ls 指令/tree 指令
3.1.1.1.ls 指令
ls
可以显示出当前路径下的目录名和文件名,实际上目录也可以理解为一种比较特殊的文件,但终究是一个文件(Linux
底下一切皆能理解为文件,以后您就可以体验到这句话的魅力),因此也可以说成列出当前目录下的所有文件。
-a
列出当前目录下的所有文件,包括以.
开头的隐藏文件-l
则列出文件的详细信息(属性),可以简略ls -l
为ll
指令-i
则可以查看文件的inode
编号,后面有补充这个inode
编号的作用,但是我们暂时用不着,可以先忽略不看-t
以时间顺序排序文件-r
将文件反向排序-R
列出所有子目录的文件-F
在每个文件名后附上一个字符以说明文件的类型(*
表示可执行的普通文件、/
表示目录、@
表示符号链接、|
表示 FIFOs、=
表示套接字sockets
,这些我们暂且不谈)-d
将目录像文件一样显示(并且会用/
来标识这是一个文件夹),而不是显示其下的文件,这个指令可以拿来查看该文件夹是否存在(毕竟如果这个文件夹不存在,则会输出错误),结合-l
使用变成-ld
还能单独显示文件夹的信息-k
以 k 字节的形式表示文件的大小-n
用数字的UID
、GID
代替名称来显示文件信息(说白了就是用于以数字形式显示文件和目录的所有者和组,没什么大不了的)-s
在文件名后面输出该文件的大小-1
一行只输出一个文件,如果直接使用ls
就会发现文件都堆叠在一起输出了,这个指令更加方便查看文件夹内部的文件
在查找文件的时候,可以使用通配符 *
来查找文件,通配符是一种占位,例如对于文件:text1.txt、text2.txt、text3.txt、text14txt
,可以使用 \*.txt
来表示这些文件,也就是说,\*
替代了 text1、text2、text3、text4
这些文件的名字。
上述的指令选项有一些是可以组合为一个选项的,例如:ls -al
就使用了两个选项。
重要
补充:因为“文件 = 内容数据 + 属性数据”,所以哪怕是空文件,也是需要在磁盘上占用空间。
重要
补充:Linux 隐藏文件/目录的方式是“名字以.开头”,这些文件的隐藏避免用户误删、误写这些重要的文件,借此来保护系统的重要文件。
重要
补充:每个文件在文件系统中都有一个唯一的 inode(Index Node)
,用于标识该文件。
重要
补充:如果您感兴趣的话,使用 ls /
则可以看到当前系统下根目录下所有的一级子目录,我挑几个重点的供您参考,其他的您可以稍作搜索。
# 查看根目录
$ ls /
bin sbin dev etc home lib
lib64 proc root run tmp var
usr srv sys media mnt opt
/bin
:包含系统启动和运行时需要的基本命令,这些命令通常被所有用户和系统进程使用。/sbin
:包含系统管理员使用的系统管理命令,只有超级用户才能访问。/dev
:包含系统中的设备文件,每个硬件设备和外部接口都在这里有一个对应的文件。/etc
:包含系统的配置文件,如网络配置、软件配置、权限配置等。/home
:包含系统中用户的目录,每个用户都有一个以用户名命名的子目录,存储个人文件和配置。/lib
和/lib64
:包含系统的共享库文件,供可执行程序调用。/proc
:包有关系统内核和进程的信息,以伪文件系统的形式呈现。/root
:包含超级用户的主目录,存放root
自己的重要文件。/run
:包含在系统启动过程中创建的临时运行时文件,例如PID
文件和UNIX
域套接字。/tmp
:用于存放临时文件的目录,所有用户都可以访问,通常在系统重启后通常会被清空。/var
:包含变化数据的目录,例如日志文件、缓存和临时文件等。/usr
:包含用户可执行程序、库、文档、源代码和其他与用户相关的数据。它通常被描述为包含“次要系统资源”,因为它包含了不是操作系统本身的必要文件,而是与用户交互和操作系统运行相关的文件。/srv
:包含服务数据的目录,例如HTTP
服务器或FTP
服务器的数据文件。/sys
:包含内核访问接口,允许用户和程序在运行时与内核进行交互,包括读取和修改内核参数、查询系统硬件信息等。/media
和/mnt
:用于挂载可移动介质(如光盘、USB 驱动器)和临时挂载其他文件系统的目录。/opt
:用于安装额外的软件包,通常是第三方或附加的软件包。
当然,不同操作系统乃至不同版本的操作系统,上述文件目录都会有所差别。
重要
补充:ll -a --group-directories-first
这个指令挺好用。
3.1.1.2.tree 指令
tree
指令可以以多叉树的形式显示出目录下的子目录和文件。
一般情况下,该指令可能没有被默认安装,可以使用 yum
安装(yum
是一个软件包管理,类似于 Windows
下的微软商店,这个 yum 的相关使用我们以后会提及,这里您先用着就可以),安装的过程为:先使用 su -
指令转化 root
账户,再使用指令 yum install -y tree
(如果没有成功,以后再来尝试把,等您学习了权限和安装包管理后,就会这一块的安装指令是很简单的...)
3.1.2.pwd 指令
显示用户当前所处的路径/位置,要注意 Linux
的路径风格符和 Windows
不同。Linux
的路径分隔符是 /
(但是 Windows
是 \
),一串文件的绝对路径最开头的 /
也被经常叫做“根目录”,是 Linux
所有文件的源头。
3.1.3.cd 指令
该指令可以进入到一个路径/目录里,在 Linux
中磁盘上,文件采用目录树的方式存储文件。度不为 0
的节点为目录、度为 0
的叶子节点为文件,这样的设计能使得文件拥有唯一标识的路径。
其中 .
表示当前目录,..
表示上一级目录。从根目录开始的路径称为“绝对路径”,使用 .
和 ..
为参考点表示的路径称为“相对路径”。
cd 指令还有一些快捷的用法:
cd ~
能快速到达当前普通用户的“用户文件夹/工作目录/家目录”,对于root
而言,root
的家目录是/root
cd -
能快速恢复到上一次所处的路径,这个也经常使用
3.1.4.mkdir 指令/touch 指令
3.1.4.1.mkdir 指令
在当前路径下创建一个“目录”,或者叫“文件夹”。
mkdir
指令也有一个常用的选项:-p
,mkdir
本身不能连续创建连续的一串目录,但是加上这个选项就可以递归创建多个子文件夹。
如果需要为新建目录指定权限,可以使用 -m
选项(关于权限我下一章再提及)。
3.1.4.2.touch 指令
在当前路径下创建一个“普通文件”。另外 touch
指令还有一个作用就是“更新文件最近修改时间”,对于已经存在的文件,再次 touch
就会发现其最近修改时间属性发生了变化(包括目录也可以生效)。
-d yyyymmdd
:指定将文件的访问时间和修改时间修改为指定的日期时间。其中yyyymmdd
表示年月日,可以包含时间部分。-a
:表示只修改文件的访问时间为当前时间,不修改修改时间。-m
:表示只修改文件的修改时间为当前时间,不修改访问时间。
3.1.5.rmdir 指令/rm 指令
3.1.5.1.rmdir 指令
使用 rmdir
指令可以删除空目录,如果想要删除非空目录,则会报错。
使用 -p
选项来删除空目录,并检查其父目录是否为空,如果空目录被删除后,其父目录也为空,则会一同删除父目录。
注
吐槽:老实说我很少用这个,用 rm
既能删除数据文件又能删除目录文件。
3.1.5.2.rm 指令
使用 rm
指令同样也可以执行删除的命令,可以删除文件,默认情况下无法删除非空目录。
-r
选项表示递归,这个选项会递归删除非空目录,在使用这个选项删除非空目录时,有时会出现删除提示来确认是否删除(例如:在删除别人文件的情况下)-f
加上这个选项可以屏蔽上述出现的删除提醒,一般会把-r
和-f
结合起来使用,即:使用-rf
-i
选项可以让rm
指令在删除每个文件或目录前询问用户是否确认删除,从而避免误删重要文件。当使用-i 选项时,rm
会依次列出要删除的每个文件或目录,并提示用户选择是否删除,用户需要输入y
或n
来做出选择,可以实现精细化删除文件。
重要
补充:可以结合之前讲过的通配符 *
来批量精确删除某些文件。
由于 Linux 没有回收站,尽管能够恢复数据,但是还是不要随便使用 rm
指令,rm
指令很强大,在 root
身份下,甚至可以把整个根目录删除。也就是所谓的“删库跑路”
警告
警告:使用 rm
删除文件后基本很难恢复,因此学到后面的时候,我会带您使用 shell
脚本来制作一个回收站脚本,避免出现删除重要文件难以恢复的情况(自己一个人倒还好,一旦是多用户场景就可能比较危险)。
3.1.6.file 指令/stat 指令
file
指令可以简单查询一个文件的类型。
# 使用 file
$ file test.txt
test.txt: ASCII text
stat
指令是用来显示文件或目录的详细属性信息的。
# 使用 stat
$ stat test.txt
File: ‘test.txt’
Size: 6
Blocks: 8
IO Block: 4096 regular file # 常规文件
Device: fd01h/64769d
Inode: 681003
Links: 1
Access: (0664/-rw-rw-r--)
Uid: ( 1001/ ljp)
Gid: ( 1001/ ljp)
Access: 2024-04-24 16:43:14.707316379 +0800
Modify: 2024-04-24 16:43:12.962307587 +0800
Change: 2024-04-24 16:43:12.962307587 +0800
Birth: -
其中我们要认识一下上面显示信息的表头关键字:
File
文件名或路径Size
是文件大小(以字节为单位)Blocks
显示了文件占用的实际总磁盘的块数IO Block
"Blocks" 是指文件实际使用的磁盘块数量,而 "IO Block" 则是文件系统进行输入输出操作时使用的磁盘块大小Type
标识文件的类型(普通文件、目录、链接等)Device
包含文件的设备编号Inode
文件的索引节点号Links
硬链接的数量Access
文件的访问权限Uid
、Gid
分别表示文件的所有者的用户ID
和文件的所属组的组ID
Access
、Modify
、Change
分别表示:最后访问时间、内容最后修改时间、属性最后修改时间Birth
文件的创建时间
3.1.7.cp 指令/mv 指令
3.1.7.1.cp 指令
cp
指令可以复制文件,注意拷贝也是需要权限的,因此权限不够的时候会出现拷贝失败的情况。(下面的 cat
指令是将文本文件的文本内容输出到终端了,可以拿来查看一些短小文件的文本内容,后面会提及这个指令)
如果指定拷贝后的目的文件不存在,则会创建对应的目的文件(下面这个例子原本是没有 txt_4.c
这个文件的)
cp 指令的选项也比较多:
-r
拷贝默认不能直接拷贝非空目录,需要加上递归选项才可以进行整体拷贝-f
或者-force
强行复制文件,不论目的文件是否存在(在目标文件已经存在的情况下仍然进行复制操作,覆盖原有文件而不提示)-i
或--interactive
可以在覆盖文件之前询问用户
如果是拷贝多个文件就可以使用:cp 源文件1 源文件2 源文件3 ... 目标路径
,如果是多个文件夹也是类似操作:cp 文件夹1 文件夹2 文件夹3 ... 目标路径
。
3.1.7.2.mv 指令
mv
指令可以移动一个文件,实现类似“剪切”的功能,还可以利用这个指令给文件改名。
接下来让我们尝试着改掉 file
这个目录的名字:
3.1.8.diff 指令
diff
用来查找两个文件的差异:
如果一行在
file1
中存在但在file2
中不存在,那么这行将以<
开头。如果一行在
file2
中存在但在file1
中不存在,那么这行将以>
开头。如果一行在
file1
和file2
中都存在,但内容不同,那么这行将会以file1_line file2_line
的形式显示。
注意
注意:diff
命令只能比较文本文件的差异,如果要比较二进制文件,可以使用其他专门的工具,如 cmp
或 xxd
。
3.1.9.locate 指令/find 指令
3.1.9.1.locate 指令
locate
命令用于在系统中快速定位文件路径。它会搜索系统中的数据库(通常由 updatedb
命令定期更新),而不是实时搜索文件系统。这使得 locate
命令的速度非常快,但有时可能不够实时。
使用 locate
命令非常简单,只需在终端中输入 locate
,后跟你要搜索的文件名或路径的一部分。例如:
locate filename
这会返回系统中包含 "filename"
字符串的所有文件路径。
默认情况下,locate
命令会搜索整个文件系统,因此可能会返回大量结果。你可以结合其他命令来缩小搜索范围,例如 grep
,head
或 tail
。
请注意,由于 locate
命令是基于数据库的,因此需要定期更新数据库以保持准确性。你可以使用 updatedb
命令手动更新数据库,或者设置定期更新的任务(不过可能需要提高权限)。
3.1.9.2.find 指令
而 find
指令实际上是很复杂的,选项特别多,最基本的选项 -name
就是寻找文件,使用格式如下:
$ find 某个目录 -name 要寻找的文件名字
这样就可以在某个目录下寻找对应的文件。
也可以 find
多个文件,使用 -n
来查看在不同文件内的行数。
find
命令的 -exec
选项允许你在搜索结果上执行特定的命令。这个选项的语法是:find /path/to/search -exec command {} \;
,其中:
/path/to/search
是你要搜索的目录路径。command
是你要执行的命令。{}
是find
命令找到的每个文件或目录的占位符。\;
表示命令的结尾。
举个例子,假设您想在当前目录及其子目录中查找所有 .txt
文件,并将它们复制到另一个目录中,你可以使用命令 find . -type f -name "*.txt" -exec cp {} /path/to/destination \;
。
这个命令会在当前目录及其子目录中查找所有以 .txt
结尾的文件,并将它们复制到 /path/to/destination
目录中。
重要
补充:查询的时候基本少不了通配符的存在。
*
:匹配任意长度的任意字符(包括零长度)。例如,*.txt
匹配所有以.txt
结尾的文件。?
:匹配任意单个字符。例如,file?.txt
匹配file1.txt
、file2.txt
等文件。[...]
:匹配括号中列举的任意一个字符。例如,file[123].txt
匹配file1.txt
、file2.txt
、file3.txt
等文件。[!...]
或[^...]
:匹配不在括号中列举的任意一个字符。例如,file[^123].txt
匹配除了file1.txt
、file2.txt
、file3.txt
之外的文件。
3.1.10.dd 指令
dd
指令和 cp
指令很像,但是这里只需要了解一下 dd
指令和 cp
指令的一些区别即可:
功能:
cp
命令用于复制文件和目录,它可以在文件系统中进行文件的复制操作。而dd
命令用于复制数据块,包括文件和设备,它可以在更底层的层面上进行数据的复制和转换。灵活性:
cp
命令相对简单直观,适用于大部分常见的复制操作。它提供了丰富的选项,如递归复制、交互式提示、增量复制等,方便用户根据需求自定义复制行为。而dd
命令更加灵活,可以通过设置参数来控制输入块大小、跳过块数、处理标志等,使用户可以进行更底层的数据操作和转换。适用场景:
cp
命令适合在文件系统中复制文件和目录,对于普通的文件复制操作或备份操作非常方便实用。而dd
命令适合处理更底层的数据操作,如创建磁盘映像、备份和还原整个分区、执行低级别的数据转换等任务。它可以直接读取和写入设备,可以在数据块级别上进行操作。
警告
警告:该指令有点危险,除非您完全知道自己在做什么,否则不要使用!
3.1.11.ln 指令
ln
是 Linux
系统中的一个命令,用于创建链接(link
)或符号链接(symbolic link
)。它用于在文件系统中创建文件或目录的链接,使得多个路径可以指向同一个文件或目录。
ln
命令有两种常见的使用方式:
创建硬链接:
ln source_file hard_link
其中source_file
是要创建链接的源文件路径,hard_link
是要创建的硬链接的路径。通过创建硬链接,可以在文件系统中创建一个新的链接文件,该链接文件与源文件具有相同的inode
和数据内容。对于用户而言,硬链接会被视为独立的文件,可以像原始文件一样访问和修改,删除源文件不会影响硬链接。但是,硬链接只能链接到同一个文件系统上的文件。创建符号链接/软链接:
ln -s source_file symbolic_link
使用-s
选项可以创建符号链接,也称为软链接。符号链接是一个特殊类型的文件,其中包含指向源文件或目录的路径。与硬链接不同,符号链接在文件系统中创建了一个新的文件,该文件保存源文件的路径信息。符号链接可以跨越文件系统边界,并且可以链接到任何类型的文件或目录。当软链接的源文件被删除时,软链接仍然存在,但它将成为一个“坏链接broken link
”。这意味着软链接指向的源文件不存在了,因此无法再通过软链接访问或使用源文件。
请注意,ln
命令的参数顺序是源文件(或目录)先,然后是链接文件的路径。在使用 ln
命令之前,请确保您具有适当的权限来创建链接,并且目标路径不存在重名文件或目录。通过使用 ln
命令,您可以轻松地创建链接或符号链接,以便在文件系统中共享文件或目录,并提供更灵活和方便的访问方式。
3.1.12.传输指令
在 Linux
系统中,传输文件的最快方法通常是使用 rsync
或 scp
命令,一般推荐使用 rsync
,这是一个强大的工具,适用于增量文件传输,能够高效地同步文件和目录。基本用法如下:
$ rsync -avz --partial -- append-verify -e 'ssh -p <port>' --info="progress2" /path/to/source <user>@<host>:/path/to/destination
-a
归档模式,表示递归复制文件并保持源文件的权限、时间戳和符号链接-v
详细模式,在执行时显示详细信息-z
压缩传输的文件,以减少传输的数据量,提高传输速度--partial
允许在传输中断时保留部分传输的文件,下次重启传输时可以从中断的地方继续,减少带宽消耗--append-verify
在传输中断时,将重新传输还没有完成的部分,同时验证已传输的部分,确保文件完整性-e 'ssh -p <port>'
指定远程shell
使用SSH
,并设置SSH
的端口号<port>
--info="progress2"
显示传输的进度信息,包括整体传输速度和时间预估。progress2
参数还会在传输结束时显示最终的传输统计信息
3.2.文本操作指令
下面的文本操作命令可能需要拿一个大文件来测试,可以提前在您的目录下写好一个脚本创建(您无需理解原理)复制下面的脚本到您的 bash
界面即可:
$ cnt=0; while [ $cnt -le 1000 ]; do echo "hello word $cnt"; let cnt++; done > big.txt
$ lltotal 24
-rw-rw-r-- 1 ljp ljp 14906 Jul 28 08:32 big.txt
后续的文本操作命令可以使用这个 big.txt
文件来测试
3.2.1.cat 指令
重要
补充:标准文件的概念
默认程序运行的时候,会自动打开三个文件:stdin(标准输入)
、stdout(标准输出)
、stdrerr(标准错误)
。在 C 语言的 fscanf()
、fpinrf()
经常会有用到。因此下面的文本操作基本都会涉及到这三个文件,这一点您现在知道即可,无需深入了解。
cat
指令可(Concatenate
,即“连续”的缩写)以来快速输出一个文件的内容来查看,而 tac
则会逆向(行逆向,最后一行文本先打出来)输出文件内容来查看。
cat
指令也有一些比较有趣的选项:
-n
会显示每行的行号-E
在每行末尾显示一个美元符号“$”表示该行结束-s
多行连续空行变为单行-b
对非空行输出所有编号
如果直接使用 cat
后面不带上任何文件,那么接下来无论输入什么字符,就会显示输出什么字符。
cat
可以进行:
从键盘读取的
可以改成从文件读取
也可以使用输入重定向
<
把文件读取。(2 和 3 的作用目前是类似的,以后我们讲到IO
再来探讨)
然后 cat
会做:
默认输出到屏幕上
也可以利用输出重定向“>”来输出到某个文件(这样就可以达到复制文件的效果)
因此,可以用 cat 目录实现一些骚操作:cat < txt1.txt > txt2.txt
这样写的结果是:使用 cat
把 txt1.txt
先使用 <
读取文件内容,在使用 >
把数据输入到 txt2.txt
文件中。
3.2.2.printf 指令
和 C 语言的 printf()
有些许不同,但是作用类似。这个 printf
是一个 shell 命令,其作用是在终端打印出字符。
$ printf "nihao\n"
nihao
3.2.3.echo 指令
echo
指令用于在终端或脚本中输出文本或变量的内容。它通常用于打印消息、显示变量值、生成输出等。直接使用默认将字符串输出到终端里。
$ echo "Hello, I am limou."
Hello, I am limou.
可以利用输出重定向符 >
,快速书写字符串内容到某个文件(如果目标文件不存在就创建目标文件后再访问该文件)
$ echo "hello" > text.txt
$ cat text.txt
hello
访问实际上分为两种:一种叫“从文件开始,覆盖式写入”,另一种叫“从文件结尾,追加式写入”。如果直接对已经存在的文件使用 >
就是覆盖式写入,若是使用 >>
就是追加式写入(会自动换行后再进行追加)。
重要
补充:另外,也可以利用 >
来创建空文件或者清空文件,即:> 文件名字
,对于不存在的文件就会创建该文件,对于存在的文件就会进行清空。
这里再介绍一些参数:
-n
:可以把echo
的末尾取消回车符,连续使用echo
指令但是希望输出一行时会用到-e
:解释引号(双引号和单引号)内的特殊字符(比如换行符\n
),如果不使用-e
参数,默认情况下引号会让特殊字符变成普通字符原样输出
3.2.4.more 指令/less 指令
有的时候输出的文本量太多了,直接使用 cat
指令还需要自己滑到上面查看文件最开始的内容。
因此使用 more
指令可以实现分页的功能,使得文本不必全部输出,只输出一部分内容,使用回车可以进行翻页,点击 q
按键可以退出分页模式,也可以使用选项“-数字”指定输出。
缺点是 more
回看文件比较困难,所以我们更加推荐使用 less
指令替换这个命令,使用该指令打开文本文件后可以使用方向键(Linux
的方向键)来翻页,同样也是使用 q
来退出 less
指令。
打开
less
后使用/文本
可以进行向下搜索打开
less
后使用?文本
可以进行向上搜索-N
显示每行的行号-i
忽略搜索时的大小写n
重复前一个搜索(结合/
和?
使用)N
反向重复一个搜索(结合/
和?
使用)
这个指令在查看日志的时候很方便。当然,使用编辑器能更加细致阅读文本文件,例如:Vim
,但是如果误操作可能会对文件发生改动。
3.2.5.tail 指令/head 指令
tail
指令默认可以看末尾 10 行,可以带“-数字”选项选择要看地末尾行数。
head
指令默认可以看开头 10 行,可以带“-数字”选项选择要看地开头行数。
可以利用 tail
指令和 head
指令和重定向符号 >
来提取文本的中间部分,例如下面的操作就可以一个文件的 [999,1009] 行:
$ head -1010 file.txt > tmp.txt
$ tail -11 tmp.txt
但是这种方法不太好,会创建出临时文件,不够优雅,让我们来尝试使用管道 |
(后面会详细讲解管道的知识,使用管道符号“|”用于连接两个命令的输入和输出。管道是用来传导数据的,管道有入口和出口,可以连接多条命令,使得我们可以像流水一样批量化处理数据,“管道”实际上也是一个文件:管道文件。这个管道文件大部分情况都是内存级的文件,没有在磁盘上)。
$ head -1010 file.txt | tail -11 # 入口 | 出口
重要
补充:另外这里介绍一个强有力的工具:xargs
指令,它能够捕获一个命令的输出,然后传递给另外一个命令,用于很多不支持|管道来传递参数的命令:
find . -name "*.c" -maxdepth 1 | xargs rm
find . -name "*.c" -maxdepth 1
找到当前目录下.c
结尾的文件,目录深度为1
传递给后边的
rm
指令进行删除
如果不进行深度控制:
find . -name "*.c" | xargs rm
删除的不仅是当前目录下的文件,会将子目录下的文件也删除
3.2.6.grep 指令
grep
指令叫“行文本过滤工具”,可以以行为单位过滤非指定的文本文件,显示出指定文本所在的文本行。结合之前学的文本处理的相关指令(tail
、head
、重定向、管道等),grep
指令就显得十分强大了。
-n
选项可以显示出指定文本行在文件中的行数-v
选项则可以反向匹配,要求查早出非指定的文本所在的行,而不是指定的文本所在的行-i
选项可以取消大小写查早显示,grep
默认对大小写敏感-E
选项可以用来扩展选项为正则表达式: “$”表示匹配文件末尾,字符需要在“$”之前,表示以字符结尾“a$”表示以 a 结尾 “”表示匹配文件起始,字符需要在“”之后,表示以字符起始“^a”表示以 a 起始
3.2.7.cut 指令
cut
命令用于从文件的每一行中剪切出指定的字段,并将这些字段输出到标准输出。它通常与 -d
(指定分隔符)和 -f
(指定字段)选项一起使用。
cut OPTION... [FILE]...
,其中 OPTION
是 cut
命令的选项,FILE
是要处理的文件名。
常用选项包括:
-d
:指定字段的分隔符,默认为制表符(\t
)。-f
:指定要提取的字段,可以同时提取多个字段,用逗号分隔。
例如,假设有一个名为 data.txt
的文件,可以做如下提取的查询:
使用 cut 指令
vim data.txt
apple,10,red
banana,15,yellow
orange,20,orange
cut -d ',' -f 1, 3 data.txt
apple,red
banana,yellow
orange,orange
这个例子中,我们指定了逗号为分隔符 -d ','
,并使用 -f 1, 3
选项指定提取第一个和第三个字段。
3.2.8.uniq 指令
uniq
指令可以将重复相邻的多端文本叠合、压缩成一段文本输出,也就是所谓的“文本去重”,需要注意的是只有“相邻的去重”。
不过可以利用这个命令和 echo
等众多命令来对一个文件做到相邻去重。
使用 uniq 指令
$ cat text
aaaaaaaaaaa
aaaaaaaaaaa
aaaaaaaaaaa
aaaaaaaaaaa
bbbbbbbbbbb
bbbbbbbbbbb
bbbbbbbbbbb
$ uniq text
aaaaaaaaaaa
bbbbbbbbbbb
3.2.9.sort 指令
这个指令可以将文件信息进行排序。可以按照字母顺序或数值顺序对行进行排序,并将结果输出到标准输出。以下是 sort
的基本用法:
sort 选项 文件名
如果不指定任何选项,则默认按照字母顺序对行进行排序。
一般情况下,sort
命令需要提供要排序的文件名作为参数。以下是一些常用的选项:
-r
:降序排序(逆序)-n
:按照数值顺序排序-u
:去重,只显示唯一的行-k 起始列, 结束列
:按照给定的列范围进行排序。可以使用正整数或者负整数来指定列的位置,其中正整数表示从左往右的列数,负整数表示从右往左的列数。如果起始列和结束列相同,则只针对该列进行排序。
其他选项还好理解,但是这个 -k
是什么意思呢?在文本文件中,“列”指的是以某种分隔符(如空格、制表符等)分隔的数据元素。每一列包含一个或多个字符。例如,以下是一个用制表符作为分隔符的文本文件示例:
Name Age letter
Eimou 25 a
Limou 30 b
Dimou 18 c
Iimou 18 a
Timou 30 d
在这个示例中,每一行表示一个记录,每一列表示一个字段。列与列之间由制表符分隔,第一列是姓名,第二列是年龄,第三列是携带的字母。
在排序过程中,-k 起始列, 结束列
选项用于指定需要排序的列范围,如果起始列的项相同,就使用后续的列来排序,又相同就在往后,直到到达起始列。
$ cat text.txt
Name Age letter
Eimou 25 a
Limou 30 b
Dimou 18 c
Iimou 18 a
Timou 30 d
$ sort -k 2,3 text.txt
Iimou 18 a
Dimou 18 c
Eimou 25 a
Limou 30 b
Timou 30 d
Name Age letter
如果是想跳着选择列,还可以使用类似:sort -k 2,2 -k 4,4 text.txt
这样的方法。
注意,在排序命令中,列的位置是从 1
开始计数的,第一列是 1
,第二列是 2
,以此类推。
请注意,sort
命令也支持同时处理多个文件,它将按照文件的顺序对它们进行排序。
sort file1.txt file2.txt
上述命令将对 file1.txt
和 file2.txt
中的行进行统一排序,并将结果输出到标准输出。如果利用重定向就可以给一个文件排序,若是结合 uniq
指令还可以做到排序单个或多个文件后再去重的效果,下面就是利用管道来“排序+去重”的指令。
$ sort 文件名 | uniq
3.2.10.wc 指令
wc
是一个常用的命令行工具,用于计算文本文件中的字数、行数和字符数。它可以在终端中使用,具体的使用方法如下:
wc 选项 文件名
一般情况下, wc
命令需要提供要计算的文件名作为参数。以下是一些常用的选项:
-l
:只输出行数-w
:只输出单词数-c
:只输出字符数
如果不指定任何选项,则默认将输出包含行数、单词数和字符数的统计信息。
请注意,wc
命令也支持同时处理多个文件,它将分别给出每个文件的统计信息,并在最后给出总计信息。
$ wc big.txt text.txt
1001 3003 14906 big.txt
10 7 87 text.txt
1011 3010 14993 total
3.2.11.lsof 指令
lsof
(List Open Files)是一个用于列出系统中打开的文件的命令行工具。在 Unix 和 Linux 系统中,几乎所有的操作(如打开的文件、目录、套接字、管道等)都涉及到文件描述符,因此 lsof
是一个非常有用的工具,用于排查系统中打开的文件及其相关信息。
基本用法
列出所有打开的文件:
lsof
这会列出所有进程打开的文件,包括文件、目录、网络连接等。
列出某个进程打开的文件:
lsof -p <pid>
将
<pid>
替换为进程 ID。这会显示指定进程打开的所有文件。列出某个用户打开的文件:
lsof -u <username>
将
<username>
替换为用户名。这会显示指定用户打开的所有文件。列出某个文件或目录被哪些进程打开:
lsof <file_or_directory>
将
<file_or_directory>
替换为文件或目录路径。例如:lsof /var/log/syslog
这会显示打开
/var/log/syslog
文件的所有进程。列出所有网络连接:
lsof -i
显示所有打开的网络连接。
列出某种类型的网络连接:
- TCP 连接:
lsof -i tcp
- UDP 连接:
lsof -i udp
- TCP 连接:
列出指定端口的网络连接:
lsof -i :<port>
将
<port>
替换为端口号。例如:lsof -i :80
这会显示所有使用端口 80 的进程。
列出某个协议的网络连接:
- IPv4:
lsof -i 4
- IPv6:
lsof -i 6
- IPv4:
常用选项
-t
:仅输出进程 ID,不显示其他信息。例如:lsof -t /path/to/file
-c <command>
:显示指定命令名的进程打开的文件。例如:lsof -c ssh
+D <directory>
:列出指定目录下的所有打开文件。例如:lsof +D /home/user
lsof
是一个非常强大的工具,可以帮助系统管理员和开发人员诊断系统问题、监控系统资源、排查文件锁定问题等。
3.3.用户操作指令
Linux
是一个多人协助的操作系统,不同的用户可以使用同一个 Linux
操作系统。因此在 Linux
中有关账户的相关指令也有很多。
3.3.1.用户管理
useradd
:创建新用户账户。passwd
:设置或更改用户账户的密码。passwd username
会提示你输入新的密码来更改username
用户账户的密码。usermod
:修改用户账户的属性。userdel
:删除用户账户。userdel username
会删除名为username
的用户账户(请小心使用此指令,删除用户账户也会删除用户的文件和目录)。who
:查看所有用户登录情况。who -a
可以查看当前所有用户的登录信息,有些时候我们执行的任务可能会影响到其他用户,因此有必要查看当前所在的用户进行沟通,否则可能影响其他用户(尤其是root
用户的操作)。
3.3.2.用户切换
sudo
:以管理员权限执行命令whoami
:查看当前所使用的用户,显示出用户名。exit
:如果是一个普通用户暂时登录root
用户,则使用该指令后退回普通用户,也就是root
退出登录。如果是一个普通用户直接使用exit
指令,则该普通用户退出登录。su
:su
命令(切换用户)允许您在当前会话中临时切换到另一个用户的身份。通过su
命令,您可以在不注销当前用户的情况下切换到其他用户。默认情况下,su
命令将切换到超级用户(root
)。如果使用su username
的形式,其中username
是目标用户的用户名,那么会切换到指定用户的身份。与login
不同,su
命令不会重置环境变量和工作目录,因此使用su
切换用户后,您将继承当前用户的环境设置。切换用户身份。8su username
可以将当前用户切换为username
用户,其中su -
输入root
密码后可以切换为root
身份(不带参数直接su
,相当于su root
)。login
:login
和su
命令都用于切换用户身份,但它们之间有一些区别。login
命令用于完全登录到一个新的用户账户。当您使用login
命令时,系统将要求您输入目标用户的用户名和密码。这意味着您将完全切换到目标用户的环境,包括用户的登录shell
、环境变量、工作目录等。使用login
命令后,您可以执行与目标用户相同的操作,并且所有命令将在目标用户的上下文中执行。login
命令无效的话有可能是系统配置问题可能缺少额外的软件包,也有部分需要切换到root
下才可执行。但是这个命令在ssh
远程链接的环境下基本没有什么用,所以在很多工作场景下很少使用。
3.3.3.组别设置
groupadd
:用于创建新用户组,groupadd [选项] 组名
其中,[选项]
是可选的,可以指定一些额外的参数。而 组名
则是您希望创建的用户组的名称。 以下是一些常见的 groupadd
命令选项:
-g GID
:指定用户组的GID
(组标识符)。默认情况下,系统会自动分配一个未被使用的GID
。-r
:创建一个系统用户组(也称为系统保留组),其GID
通常在低范围内。系统用户组主要用于系统进程、服务以及系统级任务。-f
:如果用户组已存在,则强制创建。如果不使用此选项且用户组已经存在,则会返回错误。强制创建用户组时,如果指定的用户组名称已经存在,系统将会先删除原先已存在的用户组,然后再创建一个同名的新用户组(注意这个操作还是很危险的)。
usermod
:修改用户账户的属性。usermod -aG groupname username
会将用户username
添加到groupname
用户组中(-a
代表添加而不是覆盖,-G
指示后面的字符串是用户组),用户组的概念我们之后会详细讲解。使用
groups 用户名
指令可以查看当前用户所在的用户组而移除用户组内用户的指令是
gpasswd -d 用户名 组名
3.4.时间操作指令
时间操作命令在当前阶段还没有特别的大用处,但是到了后期学习了 Linux 的日志就会有一些重要用途。实际上,在当今时代,时间的精准确认是十分重要的。
3.4.1.cal 指令
cal
指令可以显示出日历。
“年份”如果加上年份选项就可以显示全年的日历
-1
显示当月日历(默认)-3
三个显示前一个、当前、下一个月-s
周日星期日是一周的第一天(默认)-m
周一星期一是一周的第一天-j
显示Julian dates
是一种方便计算天数的日历-v
版本显示版本信息并退出
3.4.2.date 指令
data 指令可以格式化输出系统当前的时间数据,有很多选项可以供我们使用:
$ date +%Y:%m:%d:%H:%M:%S
2023:07:28:11:49:54
+%Y
输出年份+%m
输出月数+%d
输出日期+%H
输出小时+%M
输出分钟+%S
输出秒数合起来可以使用
+%Y:%m:%d:%H:%M:%S
来输出所有时间数据,每个数据之前的分隔符可以自己定制+%s
则输出当前的时间戳,“时间戳 = 1970 年 01 月 01 日 00: 00(但是可能要注意时差的问题)开始到现在的秒数”,该数据是单向递增的,具有唯一性,时间戳在很多地方都有所应用,是一个很重要的概念。-d
选项结合格式化输出符号@
,可以把某一个时间戳字符串转化为时间数据
$ date -d @1690514424
Fri Jul 28 11:20:24 CST 2023
[1]+ Exit 1 date -d
$ date +%Y:%m:%d -d @1687670855
2023:06:25
3.4.3.dmesg 指令
可以查看 Linux 下的日志指令,在 /var/log/
也有大量的日志文件。这些我们了解一下啊就可以,关于日志的内容凭当前的知识基础还不能阅读明白。
3.5.启停操作指令
3.5.1.关闭机器
如果使用的是云服务器下的 Linux
就可以不使用关机指令,常见的关机方法如下:
shutdown
:关机前可以发送一条警告消息给用户,指示系统将在多长时间后关机。sudo shutdown -h now
上述命令将立即关机系统。如果你想在多长时间后关机,可以使用-h
参数指定时间。sudo shutdown -h +10
这条指令就是在10
分钟后关机。-h
将系统的服务停掉后,立即关机、-r
在将系统的服务停掉之后就重新启动-t
秒数t
后面加秒数,即“过几秒后关机”的意思。其中sudo shutdown -c
可以取消关机(只适用于在倒计时状态的关机)poweroff
:poweroff
指令可以直接关闭系统,而无需发送关机消息。sudo poweroff
这个指令会立即关闭系统。halt
:执行halt
命令将立即停止系统并进入关机状态,而执行shutdown
命令则允许你指定进一步的操作,如延迟关机、重启系统或发送通知消息给其他用户。halt
命令只有一个简单的功能,即:立即停止系统(不会发送通知消息给其他用户)。
重要
补充:上述三个指令主要有以下的区别:
行为方式:
(1)执行
halt
命令会停止系统运行并进入关机状态,但不会关闭电源。(2)执行
shutdown
命令会先发送通知消息给其他用户,然后停止系统运行并进入关机状态,同样也不会关闭电源。(1)执行
poweroff
命令则会在停止系统运行后直接关闭电源。硬件支持:
poweroff
命令需要硬件支持,即主板和BIOS
需要能够正确处理该命令以关闭电源。一些较老的或特定的硬件可能无法完全支持poweroff
命令。
3.5.2.重启机器
reboot
是一个计算机命令,用于重新启动操作系统或设备。当你执行 reboot
命令时,系统将会进行一个完整的重启过程,关闭当前正在运行的程序和服务,并重新加载操作系统以及相关的驱动程序。
3.5.3.登录记录
last
是一个计算机命令,在大多数类 UNIX
操作系统中可用,用于显示系统中最近的登录记录。它显示了用户登录系统的时间、持续时间以及登录来源(如终端、远程连接等)。
当你执行 last
命令时,它会读取并解析系统日志文件(如 /var/log/wtmp
或 /var/log/utmp
),然后以时间顺序列出最近登录的用户记录。它通常会显示以下信息:
- 用户名:登录系统的用户账号名称。
- 终端:用户登录所使用的终端设备或连接方式,如控制台终端(
console
)、SSH
连接等。 - 登录时间:用户登录系统的日期和时间。
- 登出时间:用户注销或断开连接的日期和时间。
- 持续时间:用户登录的持续时间。
下面是一个示例 last
命令输出的片段:
username tty1 Wed Jul 26 12:30 still logged in
username pts/0 Wed Jul 26 10:45 - 11:15 (00:30)
username console Mon Jul 24 19:12 - down (02:33)
这个示例显示了用户 username
的登录记录,包括他们在 tty1
终端、pts/0
伪终端以及控制台终端上的登录记录。
需要注意的是,last
命令通常需要特权用户(如管理员或超级用户)才能执行,因为它需要读取系统日志文件。在某些系统中,非特权用户只能查看自己的登录记录。你可以使用 man last
命令来查看命令的详细用法和选项。
值得一提的是,last
命令只会显示已记录的登录信息,而有些情况下可能会被篡改或删除。因此,last
命令的输出仅作为参考,并不能完全保证记录的准确性。
3.6.归档操作指令
归档文件/存档文件 是由一个或多个计算机文件组成的文件,用于将多个数据文件收集到一个文件中,以便于传输和存储,也称 打包文件,归档并压缩时常称为 压缩文件。
因此您可以简单理解为如下:
打包:把文件通过整合成为一个归档文件的过程,叫做打包。仍保留原始的目录结构和权限信息,只是将它们收集到一个单独的文件中。
打包的目的是为了整理出一个方便传输的单个文件
压缩:把文件通过某种算法减小文件大小的过程,叫做压缩。不保留原始的目录结构和权限信息,而是被压缩成一个单独的文件中。
压缩的目的是为了减小文件的大小提高存储效率
这里,我把打包和压缩后的文件都称为归档文件,归档文件可以根据是都被压缩分为打包文件和压缩文件。
3.6.1.tar 指令
tar
指令是打包/解包文件的指令,但也可以做到压缩/解压文件。因此我们一般更加常用这个指令,比较万能。
有关于 tar
指令的选项有很多:
-c/-x
给所选文件建立一个归档文件,以及从归档文件中释放出所有文件(打包/解包)-z
表示用gzip
压缩/解压文件(压缩/解压)-f
表示指定的归档文件名,选项后直接跟归档文件名即可,可以作为初次创建归档文件的名字,也可以指定指令操作的是哪一个归档文件(通常该选项不是可选,必须使用该参数指明所操作的归档文件)-r
将要存档的其他文件追加到已有的未被压缩归档文件的中,不覆盖归档文件中原有的内容,通常以-rf
的形式来使用--delete
可以把归档文件内的某个文件移除,取消对其的归档,通常以--delete -f
的形式来使用-t
列出未被压缩归档文件中的内容,通常以-tf
的形式来使用-v
压缩的过程显示文件压缩过程-C
指定解档后的目标路径
上面的选项直接整合为 -czvf
即:“打包、压缩指令”来使用即可,具体的细节我们以后再谈
$ tar -czvf 归档文件名.tar.gz 文件名
而使用 tar
指令使用“解包、解压指令”就需要使用选项 -xzvf
,具体的细节也是以后再来谈,我们只需要会使用这两个复合指令即可。
$ tar -xzvf 归档文件名.tar.gz -d 解档路径
注意有的时候需要“打包压缩”和“解包解压”的文件过多就可以考虑不要带上 -v
选项。
注
吐槽:这两个指令经常使用,可以简单用一个小故事记忆一下。假设有个付费文件,需要充值才可以下载,充值(cz
)就用微信发(vf
)金额,下载(xz
)也用微信发(vf
)文件。
因此总结起来就是,czvf
和 xzvf
。
3.6.2.zip 指令/unzip 指令
zip
指令可以把文件(包括目录)压缩为 .zip
后缀的压缩文件(注意下是谁压缩成谁)。
$ zip -r 压缩包名.zip 文件
unzip
指令可以对压缩包进行解压。
$ unzip 压缩包名.zip -d 解压路径
如果需要指定解压后的路径,就需要在最后带上 -d
选项,然后带上对应的解压路径就可以。
3.7.系统操作指令
3.7.1.hostname 指令
显示或设置系统的主机名,也就是 [用户名@主机名 目录]$
中的主机名。
临时修改主机名:使用
hostname
命令可以临时更改主机名,但这种更改在系统重新启动后会失效。要临时更改主机名,可以运行以下命令:hostname new_hostname
这将立即更改主机名为
new_hostname
,但在系统重新启动后会恢复为原来的主机名。永久修改主机名:要永久更改主机名,需要编辑两个文件:
/etc/hostname
和/etc/hosts
。编辑
/etc/hostname
文件,将其中的内容更改为新的主机名。可以使用文本编辑器(如vim
或nano
)进行编辑:sudo vim /etc/hostname
在文件中输入新的主机名,保存并退出编辑器。
编辑
/etc/hosts
文件,将其中包含旧主机名的行修改为新主机名。同样使用文本编辑器进行编辑:sudo vim /etc/hosts
在文件中找到包含旧主机名的行,将其修改为新主机名,然后保存并退出编辑器。
重新启动系统:更改完主机名后,建议重新启动系统以确保更改生效:
sudo reboot
完成这些步骤后,您的 Linux
系统的主机名就会永久更改为新值了。
3.7.2.dmesg 指令
dmesg
是一个用于显示系统启动信息和内核消息的命令。它可以帮助用户查看系统在启动过程中发生的事件、设备检测信息、驱动程序加载情况、硬件错误等。
以下是 dmesg
命令的一些常见用途:
- 查看系统启动信息:
dmesg
可以显示系统启动时内核输出的信息,包括设备检测、模块加载、内核参数等。 - 诊断硬件问题:通过查看
dmesg
输出,可以检查是否有硬件故障、设备驱动程序加载失败等问题。 - 调试设备驱动程序:开发或调试设备驱动程序时,可以使用
dmesg
查看驱动程序输出的调试信息。 - 跟踪内核日志:
dmesg
可以帮助用户查看最新的内核日志消息,以便了解系统的运行状况。
3.7.3.uname 指令
uname -r
指令票可以用来获取电脑和操作系统的相关信息,例如:Linux
的操作系统版本、硬件的名称等
-a
选项可以详细输出所有信息,依次为:内核名称、主机名称、内核版本号、内核版本、硬件名、处理器类型、硬件平台类型、操作系统名称-r
选项可以查看内核版本
重要
补充:体系结构/体结构是指 CPU
的架构,下面我列举了一些出名的 CPU
架构:
1.x86
架构:x86
是英特尔(Intel
)与 AMD
共同推出的处理器架构,广泛用于个人电脑和服务器领域。x86
指令集包括多种版本,如 16
位的 x86
、32
位的 IA-32 和 64
位的 x86-64
。
2.ARM
架构:ARM
是一种低功耗的处理器架构,主要用于移动设备、嵌入式系统和智能手机等领域。ARM
架构适用于多种不同的处理器芯片,可提供较高的性能和较低的能耗。
3.Power
架构:Power
架构最初由 IBM
开发,现在由 OpenPOWER Foundation
维护。Power
处理器广泛应用于服务器和超级计算机领域,提供高性能和可扩展性。
4.SPARC
架构:SPARC(Scalable Processor Architecture)
是由甲骨文公司(Oracle
)开发的处理器架构。SPARC
运行在甲骨文的服务器和工作站上,具有良好的可伸缩性和可靠性。
如果想要查询商业化发行版,可以查询一下 etc
,在我购买的云服务器中底下有一个 redhat-release
文件,里面就包含了商业发行版的详细信息。
$ cat redhat-release
CentOS Linux release 7.6.1810 (Core)
但是不同机器的文件名字(或者文件位置)可能不太一样,您可以在网上查询您的机器具体的情况。
3.8.资源操作指令
3.8.1.磁盘操作指令
3.8.1.1.dd 指令
主要用于转换和复制文件,基本用法格式为 dd if=<input_file> of=<output_file> [options]
。
警告
警告:这个指令看看就可以了,一不小心就会写爆操作系统,慎用...
if
指定输入文件。默认是标准输入of
指定输出文件。默认是标准输出bs
指定块大小(如bs=4M
表示块大小为4
兆字节)count
指定要复制的块数conv
指定转换选项,如ucase
(转换为大写),lcase
(转换为小写),noerror
(忽略错误),sync
(将每个输入块填充到指定大小)
# 备份和恢复硬盘或分区
dd if=/dev/sda of=/path/to/backup.img bs=4M # 备份整个硬盘到一个文件
dd if=/path/to/backup.img of=/dev/sda bs=4M # 从备份文件恢复硬盘
# 创建一个磁盘镜像文件
dd if=/dev/sda of=/path/to/image.img bs=4M
# 创建引导盘, 将 ISO 文件写入 U 盘(注意这会删除U盘上的所有数据)
dd if=/path/to/image.iso of=/dev/sdX bs=4M
# 测试磁盘性能
dd if=/dev/zero of=/path/to/output.file bs=1G count=1 oflag=direct # 测试磁盘写入性能
dd if=/path/to/output.file of=/dev/null bs=1G count=1 iflag=direct # 测试磁盘读取性能
# oflag=direct 可以使用直接 I/O 写数据, 绕过缓存
# 用作数据擦除
# 使用零填充整个磁盘
dd if=/dev/zero of=/dev/sdX bs=4M
# 使用随机数据填充整个磁盘
dd if=/dev/urandom of=/dev/sdX bs=4M
# 将文本文件中的小写字母转换为大写
dd if=input.txt of=output.txt conv=ucase
3.8.1.2.mkfs 指令
可以创建 Linux
文件系统,也就是文件格式化,基本用法格式为 mkfs [-V] [-t fstype] [fs-options] filesys [blocks]
[-V]
显示文件系统的创建详情[-t fstype]
指定对应的文件系统,如etc3
和etc4
[fs-options]
传递给文件系统的一些参数filesys
指定要创建的文件系统对应的设备文件名[blocks]
指定文件系统的磁盘块数
# 格式化空文件
$ dd if=/dev/zero of=test bs=1M count=100
$ ll
total 101M
-rw-rw-r-- 1 root root 100M Aug 7 23:39 test
$ mkfs -t ext4 ./test
mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: done
Creating filesystem with 25600 4k blocks and 25600 inodes
Allocating group tables: done
Writing inode tables: done
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: done
这里我们拿空文件演示,正常来说应该是为某个存储设备进行格式化的(Linux
下一切皆文件,包括存储设备)。
而 df
命令可以用来显示 Linux
系统上文件系统磁盘的使用统计情况,基本的用法就是 df [OPTION]... [FILE]...
-a
包含所有具有0 Blocks
的文件系统-h
使用人类可读的格式,还有一个-H
单位使用1000
而不是1024
-t=TYPE
限制列出文件系统的TYPE
-T
显示文件系统的形式- 而
[FILE]
则可以指定特定的文件,统计对应的文件系统信息
3.8.1.3.df 指令
可以显示文件系统的磁盘空间使用情况,包括文件系统的总容量、已使用空间、可用空间和使用百分比,以及文件系统的挂载点。
# 使用 df 指令
$ df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 1011588 0 1011588 0% /dev
tmpfs 1023252 24 1023228 1% /dev/shm
tmpfs 1023252 620 1022632 1% /run
tmpfs 1023252 0 1023252 0% /sys/fs/cgroup
/dev/vda1 51473868 4270944 45005680 9% /
tmpfs 204652 0 204652 0% /run/user/1001
输出中的每一行表示一个文件系统。每行的字段/表头含义如下:
Filesystem
文件系统的名称或设备1K-blocks
以1KB
为单位的总块数Used
已使用的块数Available
可用的块数Use%
使用百分比Mounted on
文件系统的挂载点
根据上述例子的输出,您的系统有以下挂载的文件系统:
/dev
:devtmpfs
文件系统,用于设备节点/dev/shm
:tmpfs
文件系统,用于共享内存/run
:tmpfs
文件系统,用于运行时数据/sys/fs/cgroup
:tmpfs
文件系统,用于控制组信息/
:根文件系统,挂载在/dev/vda1
上- 此外,还有一个使用者级别的
tmpfs
文件系统/run/user/1001
,这是用户ID 1001
的临时文件系统。
通过执行 df
命令,您可以更详细地了解系统中不同文件系统的磁盘空间使用情况。
重要
补充:文件系统的概念
文件系统是计算机中用于组织和管理文件和目录的一种方式。它提供了一种结构化的方法来在存储设备上存储和检索数据。文件系统定义了文件的命名规则、存储方式、目录结构以及对文件的访问和管理操作。
常见的文件系统包括:
FAT32
(File Allocation Table 32
):一种常见的文件系统,支持较大容量的存储设备,如闪存驱动器和移动硬盘。但它有一些限制,例如单个文件大小不能超过4GB
。NTFS
(New Technology File System
):Windows
操作系统中常用的文件系统,支持大容量存储设备和较大文件。它具有更好的安全性、可靠性和性能。ext4
(Fourth Extended File System
)、ext3
、ext2
:Linux
操作系统中最常用的文件系统(Linux
扩展文件系统),支持大容量存储设备和较大文件,提供了更高的性能和可靠性。APFS
(Apple File System
):苹果公司开发的新一代文件系统,用于macOS
和iOS
系统。它支持快照、加密、优化的存储空间管理等功能。HFS+
(Hierarchical File System Plus
):旧版的苹果文件系统,在macOS
和OS X
中使用。已被 APFS 取代,但仍然可以与旧系统兼容。XFS
:XFS
一种高性能的日志文件系统,2000
年5
月,Silicon Graphics
以GNU
通用公共许可证发布这套系统的源代码,之后被移植到Linux
内核上。XFS
特别擅长处理大文件,同时提供平滑的数据传输UFS
:UFS
是UNIX
文件系统的简称,它来源于4.3Tahoe
发行版中提供的BSD Fat Fast File System(FFS)
系统,属于FFS
的演化版本
3.8.1.4.mount 指令
mount
可以把文件系统加载到指定的加载点目录,也就是 挂载,语法格式为 mount [-l] [-t <vfstype>] [-o options] <device> <dir>
。经常拿来挂载存储设备,存储设备被驱动识别后,Linux
不会自动挂载,必须手动挂载。我们使用之前 dd
命令来尝试一下。
重要
补充:文件系统可以是硬盘、分区、其他存储设备、一个虚拟文件。
-l
显示文件系统加载列表-t <vfstype>
加载文件系统的类型,大部分情况下可以不用指定,会自动识别-o options
描述设备或档案的挂接方式loop
把一个实际文件当成硬盘分区挂接上系统ro
采用只读方式挂接设备rw
采用读写方式挂载设备
<device>
要挂接的设备<dir>
要挂载的目标目录
# 使用 mount 指令
# 格式化空文件
$ dd if=/dev/zero of=test bs=1M count=100
$ ll
total 101M
-rw-rw-r-- 1 root root 100M Aug 7 23:39 test
$ mkfs -t ext4 ./test
mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: done
Creating filesystem with 25600 4k blocks and 25600 inodes
Allocating group tables: done
Writing inode tables: done
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: done
$ sudo mount test ~/data/test_my_mount
$ df -h ─╯
Filesystem Size Used Avail Use% Mounted on
# ...
/dev/loop10 90M 24K 83M 1% /home/root/data/test_my_mount # 此时可以看到新的挂载点了
$ cd ~/data/test_my_mount
$ echo "hello" > limou.txt && ls
limou.txt
此时我们就完成了把一个文件挂载为一个磁盘的目的,因此由于 Linux
把一切外部的接入设备视为文件,所以可以在设备文件接入后进行格式化,使用 mount
进行挂载(不过格式化会导致外部设备被清空,因此如果不希望这种行为出现,就可以直接根据不同外部设备的文件系统进行对应类型的挂载)。
重要
补充:使用 sudo umount 挂载点目录
就可以取消挂载。
重要
补充:当你在不同的命名空间中挂载一个文件系统时,确实可以将同一个设备挂载到不同的目录下。但是,这种挂载行为有两个关键点:
- 当你将同一个设备挂载到多个目录时,这些目录之间的内容是相同的,因为它们引用的是相同的物理设备。例如,假设你将
/dev/sda1
设备挂载到/mnt/point1
和/mnt/point2
,那么这两个目录将显示相同的文件和目录结构,因为它们引用的是同一个设备。 - 使用
--mount-proc
时,你在新的命名空间中挂载/proc
,这是一个虚拟文件系统,它的内容反映了该命名空间中的进程和系统状态。这是虚拟文件系统,不是一个物理设备,所以在不同命名空间中的/proc
可以显示不同的信息。/proc
文件系统: 这是一个虚拟文件系统,它提供了关于系统和进程的信息。它并不是一个实际存储在硬盘上的文件系统。不同的命名空间可以挂载虚拟的/proc
文件系统,并显示它们各自的进程和系统状态。在新的命名空间中挂载/proc
,实际上是在新命名空间中创建了一个新的/proc
视图,这个视图只包含该命名空间中的进程和系统信息。它不会改变主系统中的/proc
视图,因此,主系统中的/proc
目录信息与新命名空间中的/proc
目录信息是独立的。
3.8.2.内存操作指令
free
指令可以显示系统内存使用情况,包括空闲、已使用和缓存的内存。
$ free
total used free shared buff/cache available
Mem: 2046508 258904 207792 648 1579812 1590172
Swap: 0 0 0
total
总内存的大小,表示系统中可用的物理内存和交换空间(如果存在)的总和。在这里,总内存大小为2046508KB
used
已使用的内存大小,表示当前系统正在使用的物理内存的总量。在这里,已使用的内存大小为258904KB
free
空闲内存的大小,表示当前未被使用的物理内存的总量。在这里,空闲内存大小为207792KB
shared
共享内存的大小,表示多个进程共同使用的内存。在这里,共享内存大小为648KB
buff/cache
缓存和缓冲区内存的大小,表示系统用于优化磁盘I/O
操作的内存。它包括文件缓存和其他缓冲区。在这里,缓存和缓冲区内存大小为1579812 KB
available
可用内存的大小,表示当前可用于新进程或操作系统需要的内存的总量。在这里,可用内存大小为1590172 KB
Swap
表示系统中的交换空间的大小。在您提供的输出中,交换空间大小为0
,这意味着系统当前没有启用交换空间
这些指标提供了系统内存的使用情况,有助于了解系统当前的内存占用情况和可用性。
3.8.3.进程操作指令
输入 ps
就可以查看所有的进程,包括进程的 pid
和资源占用情况,不过在还没有学到进程之前,您随便用用就可以了,对了按住 [q]
键就可以退出 ps
界面。
3.8.4.综合操作指令
3.8.4.1.top 指令
top
是一个常用的命令行工具,用于实时监视系统的运行状态和进程信息。通过 top
命令,您可以查看 CPU
使用率、内存占用、进程列表以及其他关键性能指标。以下是一些常见的用法:
- 在终端中输入
top
,然后按回车键,即可打开top
命令的实时监视视图。默认情况下,它会按CPU
使用率进行排序,并显示在顶部占用最高的进程 - 您可以使用键盘上的方向键上下移动光标,以便浏览进程列表。按下
Q
键可退出top
命令 - 按下
[Shift + P]
键,可以按照CPU
使用率对进程列表进行排序 - 按下
[Shift + M 键]
,可以按照内存占用对进程列表进行排序 - 按下数字键
[1]
,可以切换到单核模式,显示每个CPU
核心的使用情况
3.8.4.2.htop 指令
还有一个加强版本的 htop
,如果您的系统有条件,还可以了解 npm install gtop
的 gtop
,这个是图形化的命令行指令(非常炫酷)。
3.8.5.资源操作指令
注意
注意:这个指令在您学习 Docker
时会学习到,目前可以跳过。
unshare
指令主要就是为了不共享命名空间而服务的,语法格式为 unshare [options] program [arguments]
,其底层其实也有配套的系统接口。
[options]
如下-i, --ipc
不共享IPC(进程通信空间)
-m, --mount
不共享MOUNT(挂载空间)
-n. --net
不共享NET(网络空间)
-p, --pid
不共享PID(进程空间)
-u, --uts
不共享UTS(UNIX 时间共享空间)
-U, --user
不共享USER(用户空间)
program
可以是任意程序[arguments]
如下--fork
执行unshare
的进程会fork()
一个新子进程,在子进程中执行unshare
传入的参数,这样子进程内部执行的unshare
创建的孙进程在某些情况下(例如创建进程空间不共享的命名空间)就不会因为没有父进程而创建异常--mount-proc
执行子进程前,将/pros
优先挂载过去,就不会导致命名空间看到同一个/pros
进程目录(例如创建进程空间不共享的命名空间,如果看到同一个进程目录就没有意义了)
使用不同的 [options]
可以进入不同的命名空间,如果启动的是 /bin/bash
程序,则可以使用 exit
退出命名空间。
# 使用 unshare
# UTS 隔离
$ sudo unshare -u /bin/bash # 此时就会有一个子进程 /bin/bash 被创建, 运行在 UTX 不共享的命名空间中
root@bash:/$ pwd
/
root@bash:/$ exit
$ exit
# PID 隔离
$ sudo unshare -p /bin/bash
bash: fork: Cannot allocate memory # 原因是这里的 /bin/bash 虽然是 unshare 的子进程, 但是由于此时进程 ID 和原系统进行了分离, 因此需要创建一个全新的进程, 否则 /bin/bash 就没有父进程无法被创建出来, 导致很多指令无法使用
root@bash:/$ exit # 所以只能退出当前 bash 然后重新想办法创建命名空间
exit
$ sudo unshare -p --fork /bin/bash # 这种方式就可以避免上述的情况
root@bash:/$ ps -ef # 但这里有一个新问题, 为什么 ps -ef 的结果和没有获取命名空间之前是一样的呢? 就是因为 /pros 目录没有提前做挂载而被子进程继承了...
$ exit
$ sudo unshare -p --fork --mount-proc /bin/bash # 此时就可以看到 pid 进行了隔离
root@bash:/$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 23:02 pts/2 00:00:00 /bin/bash
root 7 1 0 23:02 pts/2 00:00:00 ps -ef
$ exit
# MOUNT 隔离
sudo unshare --mount --fork /bin/bash
root@bash:/$ dd if=/dev/zero of=data.img bs=8k count=10240
10240+0 records in
10240+0 records out
83886080 bytes (84 MB, 80 MiB) copied, 0.125023 s, 671 MB/s
root@bash:/$ mkfs -t ext4 ./data.img
mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: done
Creating filesystem with 20480 4k blocks and 20480 inodes
Allocating group tables: done
Writing inode tables: done
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: done
root@bash:/$ mkdir ./data && mount -t ext4 ./data.img ./data # 这个挂载点在外部是无法被看见的
root@bash:/$ ls
data data.img lost+found
root@bash:/$ cd ./data
root@bash:/$ vim main.cc
root@bash:/$
root@bash:/$ ls
lost+found main.cc
root@bash:/$ exit
exit
root@bash:/$ ls
data data.img limou.txt lost+found
root@bash:/$ cd data
root@bash:/$ ll
total 0
重要
补充:不过其实还挺奇葩的,叫命名空间却没有所谓的命名出现。不过 unshare
能得到不共享的命名空间,就说明原本的进程门在某些东西上是共享的,这个共享是偏向系统层次的,因为进程说到底都运行在同一个操作系统上,因此共享某一些东西其实也无可厚非。如果只从进程地址空间空间来看的活,确实是相互独立,因此是共享还是独立要根据视角而定,这里说的共享主要有以下资源。
- MOUNT-文件系统挂载共享 在没有使用
MOUNT
命名空间的情况下,系统中的所有进程共享相同的文件系统挂载点和文件系统视图。即所有进程看到的文件系统结构是相同的,都是从根目录开始的目录树。使用MOUNT
命名空间后,每个命名空间可以有自己独立的文件系统挂载点。 - NET-网络共享 在没有网络命名空间时,所有进程共享相同的网络接口、
IP
地址、路由表。使用NET
命名空间后,网络接口和网络配置可以在不同的命名空间中独立存在。 - PID-进程 ID 共享 没有使用
PID
命名空间时,系统中的所有进程都有一个全局唯一的PID
。使用PID
命名空间后,每个命名空间内的进程可以有自己的PID
视图,这样同一个PID
在不同的命名空间中可能指代不同的进程。 - IPC-进程间通信共享 在没有
IPC
命名空间的情况下,所有进程共享同样的IPC
资源,如消息队列、信号量和共享内存。使用IPC
命名空间后,IPC
资源被隔离,不同命名空间的进程无法相互访问IPC
资源。 - UTS-主机名共享 在没有
UTS
命名空间的情况下,系统中的所有进程共享相同的主机名和域名。使用UTS
命名空间后,每个命名空间可以设置独立的主机名和域名。 - USER-用户共享 在没有
USER
命名空间的情况下,用户ID
和组ID
是全局唯一的。使用USER
命名空间后,用户和组ID
可以在不同的命名空间中映射为不同的值,从而实现更细粒度的权限控制。
3.10.其他操作指令
3.8.1.man 指令
man
指令的作用是查阅在线手册,使用 man
可以学习一些指令的细节和使用方法。
有的时候 man
指令里的提示文档可能不全,这个时候可以使用 yum
来更新 man
文档,其指令为 yum install -y man-pages
,其中 man-pages
表示的就是 man
手册(云服务器可能没有 3
号文件)。
其中 C 语言的接口在 3
号手册中,只需要 man 3
命令来查找三号文件。
man
文档不太建议看除 C
语言、系统接口以外的文档,因为有可能不够完整,不如直接去看对应语言的官网。
3.8.2.which 指令/whereis 指令/type 指令
which
指令专门用来查询某些指令/程序的路径来源。
whereis
指令也可以做到和 which
类似的事情,但是这个指令会返回包含该命令二进制文件、源代码、帮助文档的路径信息。通常,输出结果会显示在三个不同的字段中:
第一个字段表示二进制文件的路径
第二个字段表示源代码文件的路径(如果有的话)
第三个字段表示帮助文档文件的路径(如果有的话)
也可以使用对于的选项:
-b
只找二进制文件-s
只找源文件-m
只查找说明文件
需要注意的是,whereis
指令只能查找已安装的命令,而不能查找自定义的脚本或其他类型的文件。
而使用 type
可以查询一个指令是否为 bash
的内置命令,若不是就是外部程序。
查看一个指令是否为内置命令
$ type type
type is a shell builtin
$ type echo
echo is a shell builtin
$ type rm
rm is /usr/bin/rm
重要
补充:所谓的内置指令就是 bash
本身在内部已经写好的指令,无需调用外部的指令实现的具体文件,但是非外部指令的调用其实是 bash
在调用其他代码文件,不是 bash
本身进行运作的结果...当然,也不排除有的指令虽然是内置命令,但是也仍然需要调用外部程序,例如 echo
指令。
# 查看具有外部程序的内部指令
type -a echo
echo is a shell builtin
echo is /usr/bin/echo
3.8.3.alias 指令
alias
指令可以给某个指令起别名,使用格式如下:
$ alias 新别名="某些命令"
但是这个起别名的指令只在本次登录有效,如果下次再次登录你的 Linux
操作系统就会发现命令失效了,想要永久的别名指令还需要知道环境等相关知识,这个我们以后再来细细了解。
3.8.4.xargs 指令
可以把管道的输出结果作用于某些指令的选项/命令行参数。
3.8.5.history 指令
history
可以显示曾经使用过的指令,或者使用 history <number>
来查看最近的指定数量的指令历史。这些历史记录通常保存在用户的主目录下的 ~/.bash_history
文件中。
3.8.6.chsh 指令
chsh
用于更改用户的登录 shell
(即用户登录后默认使用的命令行解释器),不过对于 Linux
新手来说,这个 shell
解释器的更换暂时没有必要,继续使用 bash
即可,下面内容了解即可。
具体而言,chsh
命令允许用户修改自己的登录 shell
,或者管理员可以使用该命令来修改其他用户的登录 shell
。通过指定合适的选项和参数,可以改变用户的默认 shell
。
使用 chsh
命令时,一般需要提供以下信息:
- 用户名:要更改登录
shell
的用户的用户名。 - 新的
shell
路径:指定新的登录shell
的路径。通常,你可以输入可执行文件的绝对路径,比如/bin/bash
表示使用Bash
作为登录shell
。
例如,要将某个用户的登录 shell
修改为 Bash
,可以使用以下命令:
chsh -s /bin/bash username
其中,-s
选项用于指定新的 shell
路径,username
是要修改的用户的用户名。
需要注意的是,修改登录 shell
可能需要超级用户(root
)权限或者合适的权限级别,以便完成操作。同时,在更改登录 shell
之前,应确保选择的 shell
存在并已正确安装在系统中。
除了
Bash
,常见的还有以下几种shell
:
Bourne Shell(sh)
:Bourne Shell
是最早的Unix shell
,也是其他许多shell
的基础。它提供了基本的命令和语法,但相对较古老和简单。
C Shell(csh)
:C Shell
是一个类似于C
语言的 shell,提供了更多的交互功能和可编程性。它具有更友好的命令行编辑和历史记录功能,并支持C
风格的语法。
Korn Shell(ksh)
:Korn Shell
是对Bourne Shell
的扩展,它继承了Bourne Shell
的特性并添加了一些新功能。Korn Shell
结合了C Shell
和Bourne Shell
的优点,提供了更强大的脚本编程能力。
Z Shell(zsh)
:Z Shell
是一个功能强大的shell
,具有激进的命令补全功能和高度可配置的特性。它是对Bourne Shell
的扩展,同时也兼容Bash
和Korn Shell
,提供了更丰富的功能和更好的用户体验。除了上述常见的
shell
,还有一些其他的shell
可用,如Fish Shell
、PowerShell
等,它们都提供了不同的特性和功能,以满足不同用户的需求和偏好。每种shell
都有其独特的语法和用法,你可以根据自己的喜好和需求选择合适的shell
。
3.8.7.bc 指令
bc
是一种用于执行数学运算的命令行工具。它代表着 Basic Calculator
,可以在终端中进行简单或复杂的数学计算。
使用 bc
指令,您可以执行各种数值计算,包括基本的算术运算(加法、减法、乘法、除法),以及更复杂的操作,如幂运算、取模、三角函数等。以下是一些 bc
指令的示例:
- 加法:
echo "2 + 3" | bc
输出结果为:5
- 幂运算:
echo "2 ^ 3" | bc
输出结果为:8
- 使用变量进行计算:
a=5
b=3
echo "$a * $b" | bc
输出结果为:15
- 计算平方根:
echo "sqrt(9)" | bc
输出结果为:3
这只是一些 bc
指令的基本示例,它还提供了许多其他功能和选项,例如设置小数位数、定义函数、使用循环等等。您可以通过查阅 bc
命令的文档或使用 man bc
命令来了解更多详细信息。
另外这个指令如果配合管道使用也会有较大的用途。
重要
补充:等您对 Linux
了解的足够多,可以一一查询下面的指令的具体使用。
- 挂载操作指令:
mount、umount
- 网络操作指令:
ifconfig、ip、ping、netstat、telnet、ftp、route、rlogin、rcp、finger、mail、nslookup
- 系统安全指令:
umask、chgrp、chmod、chown、chattr、sudo ps、who
- 其他相关指令:
gunzip、unarj、mtools、unendcode、uudecode
3.8.8.stress 指令
这是一个压测指令,可以对 CPU, MEMORY, IO...
进行压力测试。
-c, --cpu N
启动N
个进程,每个进程都循环调用sqrt()
函数产生CPU
压力-i, --io N
启动N
个进程,每个进程循环调用sync
将内存缓冲区内容写到磁盘上产生IO
压力-m, --vm N
启动N
个进程,每个进程循环调用malloc()/free()
产生内存压力(可以使用--vm-bytes B
指定分配内存的大小,--keep
指定一直占用内存)-d, --hdd N
启动N
个不断执行write()/unlink()
的进程(创建文件、写入内容、删除文件)产生磁盘压力(可以使用--hdd-bytes B
指定文件的大小)-t, --timout N
测压程序经过N
秒后自动停止-q, --quite
测压的过程中进入安静模式
上述指令也可以混合起来进行混合压力测试,例如 stress -c 2 -m 1 --vm-bytes 1G -i 1 -d 1 --hdd-bytes 1G
该命令启动 2
个 CPU
工作线程,1
个内存工作线程(分配 1GB
内存),1
个 IO
工作线程,以及 1
个磁盘工作线程(创建 1GB
大小的文件并写入数据)。
4.bash 的相关热键
[ctrl+d]
:代表结束键盘输入,可以用来关闭当前终端会话,取代exit
指令[ctrl+c]
:杀死当前正在运行的命令[ctrl+z]
:中断当前正在运行的命令[ctrl+l]
:清屏,相当于执行clear
命令[ctrl+r]
:在历史命令中进行逆向搜索,键入快捷键后输入相关指令的历史片段输入部分指令的相关字符后连续敲击
[tab]
键可以查询包含相关字符的所有指令↑/↓
:浏览已执行命令的历史记录[ctrl+u]
:从光标位置删除到行首[ctrl+k]
:从光标位置删除到行尾(如果您使用的是VSCode
,则可以使用[ctrl+delete]
达到一样的效果)[ctrl+w]
:删除光标位置前一个单词
5.bash 的组合指令
5.1.使用特殊符号
;
是命令的结束符,这使得一行可以放置多个命令,上一个命令执行遇到 ;
结束后,可以继续再执行第二个命令。
# 使用 ;
$ pwd; ls
上面例子中,先执行 pwd
后执行 ls
指令。使用分号时,第二个命令总是接着第一个命令执行,不管第一个命令执行成功或失败。
另外,如果一个指令太长,则可以使用 \
来临时换行,多行指令会被合作一行执行。
# 使用 \
$ echo "This is a very long\
> string that continues on \
> multiple lines."
This is a very longstring that continues on multiple lines.
bash
还提供两个命令组合符 &&
和 ||
允许更好地控制多个命令之间的继发关系,类似 C
语言的逻辑运算符。
Command1 && Command2
上面命令的意思是,如果 Command1
命令运行成功,则继续运行 Command2
命令。
Command1 || Command2
上面命令的意思是,如果 Command1
命令运行失败,则继续运行 Command2
命令。
5.2.使用脚本语言
使用 shell
脚本可以组合多种命令,并且不是简单的叠加组合,而有类似 C
语言的语法特征,并且可以执行一些更为复杂的逻辑。
5.2.1.一份简单的 shell 脚本
- 创建脚本文件
create_files.sh
# create_files.sh
!/bin/bash
# 定义要创建的文件名列表
file_names=("file1.txt" "file2.txt" "file3.txt")
# 循环遍历文件名列表
for file_name in "${file_names[@]}"
do
# 创建文件
touch "$file_name"
# 可选:向文件中写入内容
echo "This is $file_name" > "$file_name"
# 输出提示信息
echo "Created file: $file_name"
done
运行以下命令,为脚本文件添加执行权限:
chmod +x create_files.sh
运行以下命令,执行脚本并创建文件:
./create_files.sh
不过,前期我建议您多多书写单条的指令,关于 shell
脚本,可以以后再来学习
5.2.2.shell 命令以及运行原理
这方面可以考虑看 廖雪峰的 Shell 教程,但是在 Python
日益强大的当下,很多脚本文件都开始使用 Python
编写了,Shell
语言太过于怪异,有需要再学习吧。
6.Linux 的两种理解
了解了上述指令后,您就有了 Linux
学习的基本功底,对于 Linux
的理解大致可以分为两种:
广义:
Linux
内核 +Linux
对应的配套程序狭义:
Linux
内核程序
您现在还无需深入了解什么是内核,但是您需要知道,上述所有命令都不是直接和内核进行沟通,而是通过命令行解释器(本系列使用的是 bash
)这种外壳程序或者叫 shell
程序来间接指挥内核,而内核就进行对硬件的操作,最终实现用户想要实现的事情。
shell
程序会创建子进程来执行用户的命令,而 shell
程序作为父进程会继续进行命令获取。
在不同的系统里 shell
程序可能不一样,在 Centos 7
里默认的 shell
程序是 bash
。也就是说 shell
是一种概念,bash
是对 shell
的具体实现。
注意
注意:Windows
最典型的外壳程序就是的图形化界面。