01.【Linux系统编程】Linux初识(Linux内核版本、基础指令、理论知识、shell命令及运行原理)
目录
1. Linux初识
1.1 源代码公开
1.2 认识Linux内核版本名称
2. 基础指令
2.1 ls 指令(列出目录内文件)
2.2 pwd 指令(显示用户当前所在的目录)
2.3 cd 指令(改变工作目录)
2.4 touch 指令(新建文本文件),stat(查看文件时间)
2.5 mkdir 指令(新建目录)
2.6 rmdir 指令 && rm 指令(删除空目录 && 删除文件or目录)
2.7 tree指令(以树状结构显示指定目录)
2.8 man 指令(查看man手册)
2.9 cp 指令(拷贝)
2.10 mv 指令(移动文件、修改文件名)
2.11 echo 打印字符串
2.12 cat & tac指令(查看目标文件内容,tac反向打印)
2.13 more 指令(类似cat,只能向下翻页)
2.14 less 指令(“随意”浏览文件)
2.15 head 指令(打印文件的前n行,n默认为10)
2.16 tail 指令(打印文件的后n行,n默认为10)
2.17 date 指令(显示时间)
2.18 cal 指令(显示公历(阳历)日历)
2.19 find 指令(在目录结构中搜索文件)
2.20 which 指令(搜索系统指定的指令)
2.21 alias 指令(设置命令的别名)
2.22 grep 指令(在文件中搜索字符串)
2.23 打包压缩和传输指令(zip/unzip、tar 和 rz、sz、scp)
2.23.1 zip压缩、unzip解压缩
2.23.2 tar 指令(打包/解包)
2.23.3 rz、sz传输(linux和windows互传)
2.23.4 scp传输(linux互传)
2.24 bc 指令(计算器)
2.25 uname –r 指令(获取电脑和操作系统的相关信息)
2.26 shutdown关机
2.27 重要的几个热键 [ctrl]-d退出当前用户, Ctrl-r搜索历史命令等
2.28 扩展命令
3. 理论知识(重点)
3.1 目录
3.2 路径
3.3 文件(重点:Linux系统中,一切皆文件)
3.4 命令(系统命令存放在 /usr/bin/)
3.5 重定向操作命令('>'、'>>'、'<')
3.6 管道 ' | '
3.7 时间戳
4. shell命令以及运行原理
1. Linux初识
1.1 源代码公开
The Linux Kernel Archives
1.2 认识Linux内核版本名称
2. 基础指令
2.1 ls 指令(列出目录内文件)
语法: | ls [选项] [目录或文件] |
功能: | 对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。(list的缩写:列出) |
常用命令行选项: | |
-a | 列出目录下的所有文件,包括以 . 开头的隐含文件。 |
-d | 显示当前文件/目录信息,或指定文件/目录显示。 如:ls –d 指定目录 |
-i | 输出文件的 i 节点的索引信息。 如 ls –ai 指定文件 |
-k | 以 k 字节的形式表示文件的大小。ls –alk 指定文件 |
-l | 列出文件的详细信息(默认简写ll) |
-n | 用数字的 UID,GID 代替名称。 (介绍 UID, GID) |
-F | 在每个文件名后附上一个字符以说明该文件的类型,“*”表示可执行的普通文件;“/”表示目录;“@”表示符号链接;“|”表示FIFOs;“=”表示套接字(sockets)。(目录类型识别) |
-r | 对目录反向排序 |
-t | 以时间排序 |
-s | 在文件名前输出该文件的大小。(大小排序,如何找到目录下最大的文件) |
-R | 列出所有子目录下的文件。(递归) |
-1 | 一行只输出一个文件。 |
2.2 pwd 指令(显示用户当前所在的目录)
语法: | pwd |
功能: | 显示用户当前所在的目录(Print Working Directory的缩写:打印(显示)当前工作目录(Working Directory)的完整路径。) |
常用选项: | 无 |
[root@csdn test_dir]# pwd
/root/test_dir
2.3 cd 指令(改变工作目录)
语法: | cd 目录名 |
功能: | 改变工作目录,将当前工作目录改变到指定的目录下(cd 是 Change Directory 的缩写:功能是改变(切换)当前的工作目录。) |
常用选项: | |
cd 目录 | 进入指定目录,可以是绝对路径或相对路径 |
cd .. | 返回上级目录 |
cd ~ | 快速进入自己的家目录 |
cd - | 返回到最近访问的目录 |
2.4 touch 指令(新建文本文件),stat(查看文件时间)
语法: | touch ([选项]...)filename |
功能: | touch命令参数可更改文档或目录的日期时间,包括存取时间和更改时间,或者新建一个不存在的文件。 |
常用选项: | |
-a | 只改变accsee的时间。(ctime随之更新) |
-m | 只修改 mtime 为当前时间。(ctime随之更新) |
语法: | stat 文件 |
功能: | 查看文件时间(status的缩写:状态) |
三种时间戳解释: | |
Access | 含义:表示文件内容最后一次被读取或访问的时间。 触发更新的操作: 1.使用 cat, less, more, head, tail 等命令查看文件内容。 2.在文本编辑器(如 vim, nano)中打开文件(即使只是查看,没有修改)。 3.被一个程序或脚本读取(例如 python script.py 读取了文件)。 4.被复制(cp 命令会读取源文件)。 |
Modify | 含义:表示文件内容最后一次被修改的时间。 触发更新的操作: 1.使用文本编辑器(如 vim, nano)修改文件内容并保存。 2.使用 echo >> 或 sed -i 等命令重定向追加或修改内容。 3.被程序运行后重写了文件内容。 关键点:mtime 只关心文件内容(数据块)的变化,不关心文件权限、属性的变化。这是你最需要关注的“文件是否被改动过”的时间。 |
Change | 含义:表示文件的元数据(metadata) 最后一次被改变的时间。元数据不是文件内容本身,而是文件的属性信息。 触发更新的操作: 1.修改文件权限(例如 chmod 755 filename)。 2.更改文件所有者(例如 chown user:group filename)。 3.重命名文件(mv oldname newname)。 4.创建硬链接(ln)。 5.此外,每当文件内容被修改(即 mtime 更新)时,ctime 也一定会随之更新,因为文件的大小(size)这个元数据发生了变化。 关键点:ctime 在文件的元数据或内容发生变化时(即Access和Modify分别更新时)都会更新。它更像是文件“状态”的更改记录。 |
2.5 mkdir 指令(新建目录)
语法: | mkdir [选项] dirname... |
功能: | 在当前⽬录下创建⼀个名为 “dirname”的⽬录(mkdir 是 Make Directory 的缩写:功能是创建新的目录(文件夹)。) |
常用选项: | |
-p/--parents | 递归建立目录(可选) |
2.6 rmdir 指令 && rm 指令(删除空目录 && 删除文件or目录)
语法: | rmdir [选项] [dirName] |
使用对象: | 具有当前目录操作权限的所有使用者 |
功能: | 删除空目录(rmdir 是 Remove Directory 的缩写:功能是删除(移除)空的目录(文件夹)。) |
常用选项: | |
-p | 当子目录被删除后如果父目录也变成空目录的话,就连带父目录一起删除。 |
语法: | rm [选项] [dirName/dir] |
使用对象: | 所有使用者 |
功能: | 删除文件或目录(rm 是 Remove 的缩写:功能是删除(移除)文件或目录。) |
常用选项: | |
-f | 强制删除,不询问 |
-i | 删除前逐一询问确认(如果要删除目录下有其他目录,会依次询问) |
-r | 删除目录及其下所有文件 |
2.7 tree指令(以树状结构显示指定目录)
tree命令是一个递归以树状结构显示指定目录的命令,如果没有安装
如果当前用户是root: yum install -y tree (因为现在开始用的都是root,所以推荐这个用法)
如果当前用户是普通用户: sudo yum install -y tree (后面讲讲完vim,大家才能将自己添加到系统信任列表中,暂时普通用户无法使用sudo)
语法: | tree [dirname] |
功能: | 递归以树状结构显示指定目录 |
2.8 man 指令(查看man手册)
语法: | man [选项] 命令 |
功能: | man 是 manual 的缩写:功能是访问系统的手册页(manual pages)。 |
常用选项: | |
-k | 根据关键字搜索联机帮助 |
num | 只在第num章节查找 |
-a | 显示所有章节中匹配的手册页。按 q 退出当前页后,会自动显示下一章节的内容。 |
命令 | 在man手册中查找命令相关信息,从第一章开始依次查找 |
man手册:man手册分为9章(不同系统可能会有差别) | |
1 | 是普通的命令 |
2 | 是系统调用,如open,write之类的(通过这个,至少可以很方便的查到调用这个函数,需要加什么头文件) |
3 | 是库函数,如printf,fread4是特殊文件,也就是/dev下的各种设备文件 |
4 | 特殊文件 (通常位于 /dev) |
5 | 是指文件的格式,比如passwd, 就会说明这个文件中各个字段的含义 |
6 | 是给游戏留的,由各个游戏自己定义 |
7 | 是附件还有一些变量,比如像environ这种全局变量在这里就有说明 |
8 | 是系统管理用的命令,这些命令只能由root使用,如ifconfig |
9 | 内核例程 |
man手册安装指令:sudo yum -y install man-pages |
2.9 cp 指令(拷贝)
语法: | cp [选项] 源文件或目录 目标文件或目录 |
功能: | 复制文件或目录(copy的缩写) |
说明: 如果目标目录不存在,则将源目录拷贝并重命名尾目标目录。 如果目标目录已经存在,则它会把前面指定的所有文件或目录复制到此目录中。 | |
常用选项: | |
-f 或 --force | 强行复制文件或目录, 不论目的文件或目录是否已经存在 |
-i 或 --interactive | 覆盖文件之前先询问用户 |
-r | 递归处理,将指定目录下的文件与子目录一并处理。若源文件或目录的形态,不属于目录或符号链接,则一律视为普通文件处理 |
2.10 mv 指令(移动文件、修改文件名)
语法: | mv [选项] 源文件或目录 目标文件或目录 |
功能: 2. 当第二个参数是不存在的目录名时,功能为重命名。 | |
常用选项: | |
-f | force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖 |
-i | 若目标文件 (destination) 已经存在时,就会询问是否覆盖! |
2.11 echo 打印字符串
语法: | echo [字符串] |
功能: | 打印字符串,同printf类似。 |
2.12 cat & tac指令(查看目标文件内容,tac反向打印)
语法: | cat [选项] [文件] |
功能: | 查看目标文件的内容 |
常用选项: | |
-b | 对非空输出行编号,空行打印但是不编号 |
-n | 对输出的所有行编号 |
-s | 将多行空行合并成一行打印 |
2.13 more 指令(类似cat,只能向下翻页)
语法: | more [选项] [filename] |
功能: | 查看目标文件内容,只输出一个页面,按Enter向下翻页 |
常用选项: | |
-n | 指定输出行数 |
q | 退出more |
2.14 less 指令(“随意”浏览文件)
语法: | less [选项] [filename] |
功能: | 随意浏览文件 |
选项: | |
-i | 忽略搜索时的大小写 |
-N | 显示每行的行号 |
/ 字符串 | 向下搜索“字符串”的功能 |
? 字符串 | 向上搜索“字符串”的功能 |
n | 重复前一个搜索(与 / 或 ? 有关) |
N | 反向重复前一个搜索(与 / 或 ? 有关) |
q | quit |
2.15 head 指令(打印文件的前n行,n默认为10)
语法: | head [参数] [文件] |
功能: | head 用来显示档案的开头n行至标准输出中,默认head命令打印其相应文件的开头10行。 |
选项: | -n<行数> 显示的行数 |
# 默认打印前十行
head temp.txt
# 指定打印前五行
head -5 temp.txt
2.16 tail 指令(打印文件的后n行,n默认为10)
语法: | tail 必要参数 [文件] |
功能: | 用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。 |
选项: | |
-f | 循环读取 |
-n | <行数> 显示行数 |
2.17 date 指令(显示时间)
指定格式显示时间: | date +%Y:%m:%d |
用法: | date [OPTION]... [+FORMAT] |
1. 在显示方面,使用者可以设定欲显示的格式,格式设定为一个加号后接数个标记,其中常用的标记列表如下 • %H : 小时(00..23) • %X : 相当于 %H:%M:%S | |
2. 在设定时间方面 • date -s //设置当前时间,只有root权限才能设置,其他只能查看。 • date -s 20080523 //设置成20080523,这样会把具体时间设置成空00:00:00 • date -s 01:01:01 //设置具体时间,不会对日期做更改 • date -s “01:01:01 2008-05-23″ //这样可以设置全部时间 • date -s “01:01:01 20080523″ //这样可以设置全部时间 • date -s “2008-05-23 01:01:01″ //这样可以设置全部时间 • date -s “20080523 01:01:01″ //这样可以设置全部时间 | |
3. 时间戳 • 时间->时间戳:date +%s • 时间戳->时间:date -d@1508749502 • Unix时间戳(英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp)是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒 |
# 显示常规时间
date
# Wed Jan 11 18:22:50 CST 2023date +%Y/%m/%d
# 2023/01/11date +%Y/%m/%d-%H:%M:%S
# 2023/01/11-18:23:20# 显示时间戳
date +%s
# 1673432636# 时间戳转成可视时间
date +%Y/%m/%d-%H:%M:%S -d @0
# 1970/01/01-08:00:00
date +%Y/%m/%d-%H:%M:%S -d @100000
# 1970/01/02-11:46:40
date +%Y/%m/%d-%H:%M:%S -d @1000000000
# 2001/09/09-09:46:40
2.18 cal 指令(显示公历(阳历)日历)
命令格式: | cal 参数 [年份] |
功能: | 用于查看日历等时间信息,如只有一个参数,则表示年份(1-9999),如有两个参数,则表示月份和年份 |
常用选项: | |
-3 | 显示系统前一个月,当前月,下一个月的月历 |
-j | 显示在当年中的第几天(一年日期按天算,从1月1号算起,默认显示当前月每天在一年中的天数) |
-y | 显示当前年份的日历 |
# 常规样例
cal
# January 2023
# Su Mo Tu We Th Fr Sa
# 1 2 3 4 5 6 7
# 8 9 10 11 12 13 14
# 15 16 17 18 19 20 21
# 22 23 24 25 26 27 28
# 29 30 31cal 19491949
# anuary February March
# Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
# 1 1 2 3 4 5 1 2 3 4 5
# 2 3 4 5 6 7 8 6 7 8 9 10 11 12 6 7 8 9 10 11 12
# 9 10 11 12 13 14 15 13 14 15 16 17 18 19 13 14 15 16 17 18 19
# 16 17 18 19 20 21 22 20 21 22 23 24 25 26 20 21 22 23 24 25 26
# 23 24 25 26 27 28 29 27 28 27 28 29 30 31
# ...
# ...cal -3
# December 2022 January 2023 February 2023
# Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
# 1 2 3 1 2 3 4 5 6 7 1 2 3 4
# 4 5 6 7 8 9 10 8 9 10 11 12 13 14 5 6 7 8 9 10 11
# 11 12 13 14 15 16 17 15 16 17 18 19 20 21 12 13 14 15 16 17 18
# 18 19 20 21 22 23 24 22 23 24 25 26 27 28 19 20 21 22 23 24 25
# 25 26 27 28 29 30 31 29 30 31 26 27 28
2.19 find 指令(在目录结构中搜索文件)
• 在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行,因为遍历一个大的文件系统可能会花费很长的时间(这里是指30G字节以上的文件系统)。
语法: | find [pathname] -[选项] [dstfile] |
功能: | 用于在文件树中查找文件,并作出相应的处理(可能访问磁盘) |
常用选项: | -name 按照文件名查找文件 |
2.20 which 指令(搜索系统指定的指令)
语法: | which [命令] |
功能: | 查找系统指定的命令位置,同时可以查找命令取别名情况 |
which ls
#alias ls='ls --color=auto'
#/usr/bin/ls
which pwd
#/usr/bin/pwd
2.21 alias 指令(设置命令的别名)
语法: | alias [别名]='要取别名的命令' |
功能: | 给命令取别名 |
alias hello='ls -a -l -n'
alias haha='ls -a'
2.22 grep 指令(在文件中搜索字符串)
语法: | grep [选项] 搜寻字符串 文件 |
功能: | 在文件中搜索字符串,将找到的行打印出来。(主要作用:查日志,查进程,查文本) |
常用选项: | |
-i | (ignore)忽略大小写的不同,所以大小写视为相同 |
-n | 顺便输出行号 |
-v | 反向选择,即显示出没有 '搜寻字符串' 内容的行 |
#文件内容
cat temp.txt
# abcd
# ABCD
# hello
# 1234#基本查找
grep "abcd" temp.txt
# abcd# 忽略大小写的不同,所以大小写视为相同
grep -i "abcd" temp.txt
# abcd
# ABCD# 顺便输出行号
grep -n "abcd" temp.txt
# 1:abcd
grep -ni "abcd" temp.txt
# 1:abcd
# 2:ABCD# 反向选择,即显示出没有 '搜寻字符串' 内容的那一行
grep -v "abcd" temp.txt
# ABCD
# hello
# 1234grep -vn "abcd" temp.txt
# 2:ABCD
# 3:hello
# 4:1234grep -vni "abcd" temp.txt
# 3:hello
# 4:1234
2.23 打包压缩和传输指令(zip/unzip、tar 和 rz、sz、scp)
打包压缩是什么?
打包:文件合并
压缩:减少体积
为什么?
打包:防止文件丢失
压缩:减少体积,节省存储空间,网络传送,可以有效地减少网络传送的时间。
2.23.1 zip压缩、unzip解压缩
语法: | zip [选项] [dst].zip [src] |
功能: | 将目录或文件压缩成zip格式 |
常用选项: | -r:递归处理,将指定目录下的所有文件和子目录一并处理 |
语法: | unzip [src] [选项] [dstdir] |
功能: | 将zip文件解压缩 |
常用选项: | -d:解压缩到指定目录(可选) |
# 将test/目录压缩为haha.zip
zip -r haha.zip test# 将haha.zip解压缩
unzip haha.zip# 将haha.zip解压缩到hello目录,先新建hello目录再解压缩放进去
unzip haha.zip -d hello
2.23.2 tar 指令(打包/解包)
语法: | tar [-cxtzjvf] dst.tgz srcdir |
参数: | |
-c | 建立一个压缩文件的参数指令(create 的意思); |
-x | 解开一个压缩文件的参数指令! |
-t | 查看 tarfile 里面的文件 |
-z | 是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩? |
-j | 是否同时具有 bzip2 的属性?亦即是否需要用 bzip2 压缩? |
-v | 压缩的过程中显示文件!这个常用,但不建议用在背景执行过程! |
-f | 使用档名,请留意,在 f 之后要立即接档名喔!不要再加参数! 把打包或压缩后的内容保存到哪个文件(当使用 -c 创建归档时)。 或者要从哪个文件读取内容并解包(当使用 -x 提取归档时)。 |
-C | 解压到指定目录,目录必须存在 |
简单示例:
# 将abc/目录压缩为haha.tgz
tar czvf haha.tgz abc/# 创建hello目录,并将haha.tgz压缩到hello目录里面
mkdir hello
tar xzvf haha.tgz -C hello
范例一:将整个 /etc 目录下的文件全部打包成为 `/tmp/etc.tar`
[root@linux ~]$ tar -cvf /tmp/etc.tar /etc #仅打包,不压缩!
[root@linux ~]$ tar -zcvf /tmp/etc.tar.gz /etc #打包后,以 gzip 压缩
[root@linux ~]$ tar -jcvf /tmp/etc.tar.bz2 /etc #打包后,以 bzip2 压缩
特别注意,在参数 f 之后的文件档名是自己取的,我们习惯上都用 .tar 来作为辨识
如果加 z 参数,则以 .tar.gz 或 .tgz 来代表 gzip 压缩过的 tar file ~
如果加 j 参数,则以 .tar.bz2 来作为附档名啊~
上述指令在执行的时候,会显示一个警告讯息:
『`tar: Removing leading `/" from member names`』那是关於绝对路径的特殊设定。
范例二:查阅上述 /tmp/etc.tar.gz 文件内有哪些文件?
[root@linux ~]$ tar -1 ztvf /tmp/etc.tar.gz
由于我们使用 gzip 压缩,所以要查阅该 tar file 内的文件时,就得要加上 z 这个参数了!这很重要的!
范例三:将 /tmp/etc.tar.gz 文件解压缩在 /usr/local/src 底下
[root@linux ~]$ cd /usr/local/src
[root@linux src]$ tar -zxvf /tmp/etc.tar.gz
在预设的情况下,我们可以将压缩档在任何地方解开的!以这个范例来说,我先将工作目录变换到/usr/local/src 底下,并且解开 /tmp/etc.tar.gz ,则解开的目录会在 /usr/local/src/etc 呢!另外,如果您进入 /usr/local/src/etc 则会发现,该目录下的文件属性与 /etc/ 可能会有所不同喔!
范例四:在 /tmp 底下,我只想要将 /tmp/etc.tar.gz 内的 etc/passwd 解开而已
[root@linux ~]$ cd /tmp
[root@linux tmp]$ tar -zxvf /tmp/etc.tar.gz etc/passwd
我可以透过 tar -ztvf 来查阅 tarfile 内的文件名称,如果单只要一个文件,就可以透过这个方式来下达!注意到! etc.tar.gz 内的根目录 / 是被拿掉了!
范例五:将 /etc/ 内的所有文件备份下来,并且保存其权限!
[root@linux ~]$ tar -zxvpf /tmp/etc.tar.gz /etc
# 这个 -p 的属性是很重要的,尤其是当您要保留原本文件的属性时!
范例六:在 /home 当中,比 2005/06/01 新的文件才备份
[root@linux ~]$ tar -N "2005/06/01" -zcvf home.tar.gz /home
范例七:我要备份 /home, /etc ,但不要 /home/dmtsai
[root@linux ~]$ tar --exclude /home/dmtsai -zcvf myfile.1 tar.gz /home/* /etc
范例八:将 /etc/ 打包后直接解开在 /tmp 底下,而不产生文件!
[root@linux ~]$ cd /tmp
[root@linux tmp]$ tar -cvf - /etc | tar -xvf -
这个动作有点像是 cp -r /etc /tmp 啦~依旧是有其有用途的!
要注意的地方在於输出档变成 - 而输入档也变成 - ,又有一个 | 存在~
这分别代表 standard output, standard input 与管线命令啦!
2.23.3 rz、sz传输(linux和windows互传)
这个工具用于 windows 机器和远端的 Linux 机器通过 XShell 传输文件. 安装完毕之后可以通过拖拽的方式将文件上传过去.
#安装指令
#....#Xshell传windows,将abc.zip传到当前的windows机器
sz abc.zip #windows传Xshell
rz
2.23.4 scp传输(linux互传)
scp [src-file] 用户名@目标公网IP:目标机器指定的路径# 例
scp abc.tgz haha@123.456.78.9:/home/haha/test/a
2.24 bc 指令(计算器)
2.25 uname –r 指令(获取电脑和操作系统的相关信息)
语法: | uname -r[选项] |
功能: | uname用来获取电脑和操作系统的相关信息。 |
补充说明: | uname可显示linux主机所用的操作系统的版本、硬件的名称等基本信息。 |
常用选项: | -a或–all 详细输出所有信息,依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理器类型,硬件平台类型,操作系统名称 |
2.26 shutdown关机
语法: | shutdown [选项] |
常见选项: | |
-h | 将系统的服务停掉后,立即关机。 |
-r | 在将系统的服务停掉之后就重新启动 |
-t sec | -t 后面加秒数,亦即『过几秒后关机』的意思 |
其他相关指令 | reboot(重启)、halt(关机) |
2.27 重要的几个热键 [ctrl]-d退出当前用户, Ctrl-r搜索历史命令等
• [上下键] --- 查看历史命令
• [Tab] 按键--- 具有『命令补全』和『档案补齐』的功能
• [Ctrl]-c 按键--- 让当前的程序『停掉』
• [Ctrl]-r 按键--- 根据输入内容搜索历史命令
• [Ctrl]-d 按键--- 退出当前用户:『键盘输入结束(End Of File, EOF 戒 End OfInput)』的意思;另外,他也可以用来取代exit。
• [history指令] --- 查看历史命令
2.28 扩展命令
• 安装和登录命令:login、shutdown、halt、reboot、install、mount、umount、chsh、exit、last;
• 文件处理命令:file、mkdir、grep、dd、find、mv、ls、diff、cat、ln;
• 系统管理相关命令:df、top、free、quota、at、lp、adduser、groupadd、kill、crontab;
• 网络操作命令:ifconfig、ip、ping、netstat、telnet、ftp、route、rlogin、rcp、finger、mail、 nslookup;
• 系统安全相关命令:passwd、su、umask、chgrp、chmod、chown、chattr、sudo ps、who;
• 其它命令:tar、unzip、gunzip、unarj、mtools、man、unendcode、uudecode。
3. 理论知识(重点)
3.1 目录
目录 == 文件夹
1. Linux系统中,磁盘上的文件和目录被组成一棵目录树,每个节点都是目录或文件
2. 叶子节点一定是普通文件或空目录,非叶子节点一定是非空目录。
3. 任何一个目录都会自动生成 . (当前目录)和 .. (上级目录)。
3.2 路径
1. 理解路径存在的意义: 树状组织方式,都是为了保证快速定位查找到指定的文件,而定位文件就需要具有唯一性的方案来进行定位文件。其中任何一个节点,都只有一个父节点,所以,从根目录开始,定位指定文件,路径具有唯一性。
2. 绝对路径和相对路径
• 绝对路径:一般从/开始,不依赖其他目录的定位文件的方式,绝对路径一般不会随着用户的路径变化而丧失唯一性,一般在特定服务的配置文件中经常被使用
• 相对路径:相对于当前用户所处目录,定位文件的路径方式,相对路径因为它的便捷性,一般在命令行中使用较多
3. 路径分隔符:\
3.3 文件(重点:Linux系统中,一切皆文件)
3.3.1 文件相关概念
1. 文件 = 内容 + 属性。空文件也要占磁盘空间。
2. 文件要么对内容操作,要么对属性操作,都是修改文件。
3. 隐藏文件以 . 开头
各种文件类型
d前缀:目录
-前缀:普通文件
c前缀:字符文件,键盘,显示器,终端(输入的数据具有顺序性)
b前缀:块设备,磁盘
l前缀:链接文件
p前缀:管道文件
Linux不关心文件后缀,但是不代表禁止使用后缀,有些工具需要对应的后缀,必须gcc要求.c后缀。
3.3.2 键盘输入、显示器显示也是对文件操作
键盘输入,显示器显示,也是对文件的操作。
3.4 命令(系统命令存放在 /usr/bin/)
系统命令存放在 /usr/bin/目录里面,可以直接执行,如果想让自己写的程序像系统命令一样执行,可以cp拷贝到/usr/bin/目录里面。
1. 命令,其实就是文件,命令的本质 == 可执行文件 == 我们写的C/C++程序
2. 上下键,可以寻找历史命令。
3.5 重定向操作命令('>'、'>>'、'<')
1. 输出重定向'>'(覆盖)
如果文件不存在则创建并写入,如果文件存在则先清空后写入。
echo默认的输出文件是显示器
# 将 ls 命令的输出结果写入到 list.txt 文件中(覆盖原有内容)
ls -l > list.txt# 将 echo 命令的输出写入到文件
echo "Hello World" > greeting.txt
2. 输出重定向 '>>'(追加)
如果文件不存在则新建并写入,如果文件存在则在文件内容末尾继续写入。
# 将 ls 命令的输出结果追加到 list.txt 文件中(在文件末尾继续写入)
ls -l >> list.txt# 将 echo 命令的输出追加到文件
echo "Hello World" >> greeting.txt
3. 输入重定向 '<'
将文件的内容作为命令的标准输入(stdin, 文件描述符0)
# 将greeting.txt的内容作为cat命令的标准输入
cat < greeting.txt
3.6 管道 ' | '
1. 管道是什么?
管道(Pipe) 是一种最简单的进程间通信(IPC, Inter-Process Communication) 机制。它的核心思想是:将一个命令的标准输出(stdout)直接连接到另一个命令的标准输入(stdin)。数据像水流一样通过“管道”从一个进程流向下一个进程,不需要创建任何临时文件。
数据流方向:管道是单向的。数据只能从左向右流动。
2. 管道的符号
管道使用竖线符号表示:|
基本语法:
command_A | command_B
# command_A:产生输出的命令。
# |:管道符号。
# command_B:接收输入并进行进一步处理的命令。
3. 使用示例
# 创建1000行的temp.txt文件
cnt=1; while [ $cnt -le 1000 ]; do echo "hello world $cnt"; let cnt++; done > temp.txt# 将temp.txt的前510行,作为tail -10 的输入
# 结果是:打印temp.txt文件中第501-510行的内容
head -510 temp.txt | tail -10
3.7 时间戳
Unix 时间戳(最常用的时间戳):是Linux、macOS和许多其他系统中最普遍使用的时间戳格式。
定义:从 UTC 时间 1970年1月1日 00:00:00 开始所经过的秒数(不考虑闰秒)。
也称为:纪元时间(Epoch Time)、POSIX 时间。
举个例子:
0 表示:1970-01-01 00:00:00 UTC
1635331200 表示:2021-10-28 08:00:00 UTC
1710000000 表示:2024-03-09 04:00:00 UTC
时间戳的作用:
1. 标准化与统一:全世界不同时区、不同格式的时间(如 “Oct 27, 2023” 和 “27/10/23”)很容易造成混乱。时间戳提供了一个唯一的、全球统一的数字来表示时间,方便计算机处理和比较。
2. 便于计算:因为时间戳是一个连续的整数,进行时间计算变得非常简单。
3. 计算间隔:end_timestamp - start_timestamp = 时间差(秒)
4. 计算未来时间:current_timestamp + (60 * 60 * 24) = 明天这个时候的时间戳(加上一天的秒数)
5. 日志记录:系统日志、应用程序日志几乎都使用时间戳来记录事件发生的精确时刻,这对于调试和审计至关重要。
6. 版本控制与排序:文件备份、数据库记录、软件版本等都可以用时间戳来标记,这样可以轻松地按时间顺序进行排序和检索。
7. 缓存与过期:网站和应用程序用它来判断内容是否过期(例如,检查“最后修改”时间是否晚于“最后缓存”时间)。
4. shell命令以及运行原理
Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。如何理解?为什么不能直接使用kernel?
从技术角度,Shell的最简单定义:命令行解释器(command Interpreter)主要包含:
• 将使用者的命令翻译给核心(kernel)处理。
• 同时,将核心的处理结果翻译给使用者。
为什么要存在外壳程序?
1.方便用户操作。
2. 外壳程序,保护内核。
对比windows GUI,我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)。
shell 对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结果在通过内核运行出结果,通过shell解析给用户。
shell在我们使用的系统中就是/bin/bash,的bash程序。shell还有sh、xsh等等,通称shell。