一、Linux的历史
(一)Unix操作系统的历史
Unix一开始是使用汇编语言实现的,更偏向底层与硬件挂钩,效率是比较高,但移植性比较差。
Unix的内核后续是使用C语言实现的,C语言其实是在研究Unix系统的副产物。
AT&T公司开始收回Unix的版权,开始闭源和收费。
1983年,Richard Stallman发起了GNU(GNU's Not UNIX)计划,GNU倡导自由、免费,但遗憾的是没有完全开发出GNU Hurd。(GNU采用的是微内核)
1984年,Andrew Tanenbaum教授开发了一个不含AT&T源代码的Unix操作系统,并于1987年实现取名为Minix。
1991年,Linus Torvalds受到Minix的启发开发了初代的Linux。(Linux采用的是宏内核)
(二)Unix操作系统的体系
硬件层——内核层——系统调用——shell与库函数层——应用层。
内核:管理系统的硬件资源。
系统调用:内核提供给外部的接口。
公共函数库:对于复杂的系统调用进行封装。
shell:命令行解释器。
(三)Linux系统的现状
Linux在服务器领域占据75%的市场份额,广泛应于嵌入式领域、移动嵌入式领域、云计算、大数据平台等。
Linux内核版本的网址:https://kernel.org/
二、Linux命令
(一)Linux系统的目录系统
1、Linux常用目录命令
常用命令 | 作用 |
---|---|
cd | change the working directory 改变当前的工作目录 |
ls | list directory contents 列出目录下的内容 |
pwd | print name of current/working directory 打印当前目录的路径 |
mkdir | make directories 创建目录 |
rmdir | remove empty directories 删除空目录 |
tree | list contents of directories in a tree-like format 以树状格式列出目录 |
2、命令示例
//cd 命令示例
cd <绝对路径>;//更换工作目录为<绝对路径>
cd <相对路径>;//更换工作目录为<相对路径>
cd /;//切换工作目录为根目录
cd ~ 或 cd;//切换工作目录为家目录
cd -;//切换为上一次目录
cd .;//切换为当前目录
cd ..;//切换为上一级目录
//ls 命令示例
ls;//列出当前目录下的文件
ls -a;//列出当前目录下的文件(包括隐藏文件)
ls -l;//列出相对比较详细的文件信息
ls -hl;//列出文件大小并以可读大小显示
ls -i;//列出文件的序列号
ll;//等价于ls -al
//Linux系统下,隐藏文件是以"."开头的
//mkdir 命令示例
mkdir <目录名>;//创建一个文件夹
mkdir -p <目录1/目录2/目录3/...>;//连续创建n级目录
//rmdir 命令示例
rmdir <目录名>;//删除一个文件夹
rmdir -p <目录1/目录2/目录3/...>;//连续删除目录,若其父目录变为空,则一并删除
3、Linux系统自带目录的含义
目录名 | 作用 |
---|---|
/bin | 此文件下存放的都是二进制可以执行命令文件 |
/lib | 系统使用函数库的目录 |
/dev | 存放系统下所有设备的文件 |
/proc | 一个虚拟的文件系统 |
/etc | 存放系统的各种配置文件 |
/home | 普通用户的家目录 |
/root | root用户的家目录 |
4、Linux的目录路径
绝对路径:相对于“根目录/”而言的
相对路径:相对于某一个路径而言的
(二)Linux系统的用户系统
1、Linux常用用户命令
常用命令 | 作用 |
---|---|
sudo | sudo, sudoedit — execute a command as another user 作为另一个用户执行一个命令 |
su | run a command with substitute user and group ID 切换为root用户或另一用户和组执行命令 |
useradd | 创建一个新用户或更新默认新用户信息 |
userdel | 删除用户账户和相关文件(-r) |
exit | cause the shell to exit 退出shell |
2、命令示例
//useradd 命令示例
useradd <用户名>;//添加一个用户(三无)
useradd -m;//如果用户的主目录不存在,则创建它
useradd -s;//用户登录 shell 的名称
//userdel 命令示例
userdel <用户名>;//删除一个用户
userdel -r <用户名>;//删除一个用户以及相关文件
3、Linux用户文件夹
//查看内容 cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
...
moon:x:1000:1000:Moon,,,:/home/moon:/bin/bash
test:x:1001:1001::/home/test:/bin/sh
//用户名 密码(密文) 用户id 组用户id (注释信息,可有可无) 用户所在的目录 shell的类型
//注意:中间使用冒号分割
//使用下列方式可以创建一个用户test3
//①在/home目录下有对应文件夹test3
//②shell的类型是/bin/bash
sudo useradd -m test3 -s /bin/bash
4、Linux用户的切换
Linux在切换用户时,底层使用的是用户栈,栈中已经存在的用户不能被切换。
注意,Ubantu一般不允许使用root用户登录系统。
(三)Linux系统的命令系统
1、Linux常用命令命令
常用命令 | 作用 |
---|---|
man | 系统参考手册的接口 |
>,>>,<,<< | 重定向 |
2、命令示例
//man 命令示例
man <命令>;//查看命令手册对于该命令的解释
//重定向 命令示例
//标准输入重定向
cat < file;//将file的内容作为输入与cat关联,cat将关联的内容输出
cat << tag;//将tag作为终止符,将tag之间的内容作为输入
//标准输出重定向
echo "hello" > file2;//将"hello"重定向写入file2
cat "world" >> file2;//以追加的形式将"world"写入file2的末尾
//标准错误输出重定向
cat file3 2> file4;//file3不存在,将错误输出写到file4中
cat file3 2>> file4;//将错误输出追加写到file4中
cat file3 > ok.txt 2> err.txt;//若file3存在,重定向到ok.txt;若file3不存在,错误结果重定向到err.txt
cat file3 >> ok.txt 2>> err.txt;//若file3存在,重定向追加到ok.txt;若file3不存在,错误结果重定向追加到err.txt
//特殊的重定向
cat file1 > file3 2>&1;//将file1写入file3,不管正确还是错误
3、Linux命令的特点
(1)重定向
标准输入重定向:<,0,stdin
标准输出重定向:1>,1,stdout
标准错误输出重定向:2>,2,stderr
【fd:文件描述符】对外提供给用户的就是一个简单的数字。(在Linux中一切皆文件)
(四)Linux系统的文件系统
1、Linux常用文件命令
常用创建命令 | 作用 |
---|---|
cat | concatenate files and print on the standard output 联系文件并在标准输出上打印 |
touch | change file timestamps 修改文件的时间戳 |
echo | display a line of text 显示一行文本 |
vim/vi | a programmer's text editor 程序员的文本编辑器 |
常用读命令 | 作用 |
---|---|
head/tail | output the first part of files/output the last part of files 输出文件的头部/尾部 |
more/less | file perusal filter for crt viewing/opposite of more 用于CRT查看的文件细读筛选器/与more相反 |
file | determine file type 确定文件类型 |
Ctrl+B | 一次显示上一屏幕 |
Ctrl+F | 一次显示下一屏幕 |
常用迁移命令 | 作用 |
---|---|
cp | copy files and directories 复制文件和目录 |
mv | move (rename) files 移动(重命名)文件 |
rm | remove files or directories 删除文件或目录 |
常用权限命令 | 作用 |
---|---|
chmod | change file mode bits 更改文件的模式位 |
umask | get or set the file mode creation mask 获取或设置文件模式创建掩码 |
常用查找命令 | 作用 |
---|---|
find | search for files in a directory hierarchy 在目录层次结构中搜索文件 |
grep | print lines that match patterns 多文件下,打印匹配模式的行 |
常用重定向命令 | 作用 |
---|---|
stdin/stdout/stderr | standard I/O streams 标准输入/输出流 |
常用文件系统命令 | 作用 |
---|---|
df | report file system disk space usage 报告文件系统磁盘空间使用情况 |
du | estimate file space usage 估计文件空间使用情况 |
mount | mount a filesystem 挂载文件系统 |
umount | unmount filesystems 卸载文件系统 |
常用文件链接命令 | 作用 |
---|---|
ln | make links between files 用来为文件创建链接 |
2、命令示例
//注:文件名和目录名的目的都是为了找到文件和目录,实际上是路径
//常见文件创建命令
//touch 命令示例
touch <文件名>;//创建一个文件或更改文件的时间戳
touch <文件名>{numx...numy};//批量创建x-y个文件
//echo 命令示例
echo "字符串";//将字符串显示在屏幕上
echo "字符串" > <文件名>;//将字符串输出重定向到一个文件(注意:">"的作用是重定向)
//cat 命令示例
cat <文件名>;//关联文件并将其内容打印出来
cat <文件1> > <文件2>;//关联文件1并将其内容重定向到文件2
//注意:cat适合查看小文件的内容,对于大文件不友好!!!
//vi/vim 命令示例
vim <文件名>;//以vim编辑器的方式打开文件
//常见读文件命令
//head/tail 命令示例
head <文件名>;//输出文件的头部一部分,默认10行
head -n <num> <文件名>;//输出文件的头部一部分,行数为num
tail <文件名>;//输出文件的尾部一部分,默认10行
rail -n <num> <文件名>;//输出文件的尾部一部分,行数为num
//more/less 命令示例
more <文件名>;//以CRT阅读器进行阅读,以一屏为单位
less <文件名>;//以CRT阅读器进行阅读,以一行为单位,同时支持搜索功能("/"+"搜索内容"+"Enter")
//常见迁移命令
//cp 命令示例
cp <文件1> <文件2>;//将文件1的内容拷贝到文件2中,文件2不存在就创建,存在就覆盖
cp -i <文件1> <文件2>;//将文件1的内容拷贝到文件2中,发生覆盖时给出提示选项
cp <文件名> <目录名>;//将文件拷贝到目录下
cp -i <文件名> <目录名>;//将文件拷贝到目录下,发生覆盖时给出提示选项
cp -r <目录1> <目录1>;//将目录1拷贝到目录2中,(-r)调用递归
//mv 命令示例
mv <文件名> <目录名>;//将文件移动到目录中
mv -i <文件名> <目录名>;//将文件移动到目录中,发生覆盖时给出提示选项
mv <文件1> <文件2>;//将文件1重命名为文件2
mv <目录1> <目录2>;//将目录1移动到目录2下,(无需-r)使用指针
//rm 命令示例
rm <文件名>;//删除文件
rm -i <文件名>;//删除文件,给予提示
rm -r <目录名>;//删除空目录
rm -f <目录名>;//强制删除目录
rm -fr <目录名>;//强制递归删除目录及其下属文件
rm *;//删除目录下所有文件
//注意:做文件迁移命令的时候,一定要加上-i以免误删!!!
//危险:"sudo rm -fr /"是删除根目录下所有东西,会引发系统崩溃!!!
//常用链接命令
//ln 命令示例
ln <文件1> <文件2>;//在文件1和文件2之间建立硬链接
ln -s <文件1> <文件2>;//在文件1和文件2之间建立软链接,文件2是文件1的链接文件
//常用权限命令
//chmod 命令示例
//chmod的文字设定法
chmod [who] [+/-/=] <perm> <file>;
//who表示用户,(u:本用户;g:组用户;o:其他;a/(不写):所有)
//(+:增加;-:减少;=:设置为)
//perm:权限(r:读;w:写;x:执行;-:不设置权限)
//示例
chmod u+w,g-x,o=r file1;
//chmod的数字设定法
chmod [num] <file>;
//将"rwx"视为三位二进制数.
//示例
chmod 420 file;
//常用文件查找命令
//find 命令示例
find <起始目录> <查找表达式> <关键字>;
//查找表达式:名字(-name)、用户信息(-user,-uid,-group,-gid)、文件大小(-size)、用户权限(-perm)、文件类型(-type)
//可以使用通配符“*”
//grep 命令示例
grep [Option] <查找表达式> <文件名>;
grep -n;//显示行号
grep -i;//忽略大小写
grep -r;//递归
grep -E;//使用扩展表达式功能
3、Linux文件的类别及标识
颜色 | 文件类型 |
---|---|
黑色 | 普通文件 |
蓝色 | 目录文件 |
绿色 | 可执行文件 |
红色 | 压缩文件 |
浅蓝色 | 链接文件 |
黄色 | 设备文件 |
灰色 | 其他文件 |
红色(闪烁) | 表示链接的文件存在问题 |
4、Linux文件的特点
(1)Linux的文件目录是从根目录“/”开始的,对于目录文件默认分配4096B空间。Linux下所有都是文件。
(2)执行“ls -l”之后,文件的显示格式为:
文件类型(1)本用户权限(3)组用户权限(3)其他用户权限(3)——硬链接数目/目录文件的子目录个数——用户id——组id——占用空间大小(以B为单位)——文件最后修改时间——文件名
(3)文件权限:“r:可读;w:可写;x:可执行”.
文件类型:“-:普通文件;d:目录文件;l:链接文件;b:块文件;c:字符设备文件;s:套接字文件;p:管理文件”
(4)Linux不通过后缀识别文件类型,但由于我们在Windows系统上习惯于后缀识别,我们可以也在Linux中带上后缀作为对文件格式的提示。
(5)Linux中可以使用“*”作为通配符。
(6)硬链接:链接逻辑地址指向同一物理地址。
软链接:创建了一个指向文件的快捷方式,链接文件的内容是指向文件的绝对路径,对链接文件的修改、读取操作会通过路径映射为影响指向文件,而修改链接文件的内容原则上对指向文件没有影响。
(7)正则表达式的规则:
①"^":表示以xxx开头;
②"$":表示以xxx结尾;
③".":通配一个字符;
④“*”:通配一个或多个字符,最接近的前方字符可以出现0次~任意次;
⑤"[]":匹配字符集;
⑥"[a~z]":匹配第二个字符是a~z的范围.
(五)Linux系统的内核系统
1、Linux常用内核命令
常用内核系统命令 | 作用 |
---|---|
uname | print system information 打印系统信息 |
lsb_release | print distribution-specific information 打印特定发行版的信息 |
(六)Linux系统的其他命令
常用其他命令 | 作用 |
---|---|
alias | define or display aliases 定义或显示别名 |
sort | sort lines of text files 对文本文件的行进行排序 |
uniq | report or omit repeated lines 报告或省略重复行 |
wc | print newline, word, and byte counts for each file 打印每个文件的换行符、单词和字节统计信息 |
xargs | build and execute command lines from standard input 从标准输入构建并执行命令行 |
tar | an archiving utility 压缩、解压命令 |
scp | OpenSSH secure file copy OpenSSH 安全文件复制 |
sed | stream editor for filtering and transforming text 用于过滤和转换文本的流编辑器 |
vimdiff | edit between two and eight versions of a file with Vim and show differences 使用 Vim 编辑一个文件的两个到八个版本,并显示差异。 |
三、vim的使用
(一)vim的模式
1、普通模式(正常模式)
移动:h左移;j下移;k上移;l右移;^移动到行首;$移动到行尾;gg跳转到文档开始;G跳转到文档结尾
删除:x删除一个字符,nx删除n个字符;dw删除一个单词,ndw删除n个单词;dd删除一行,ndd删除n行
撤销:u
复制:yy复制一行,nyy复制n行
粘贴:p
2、编辑模式(插入模式)
进入插入模式:i在光标前,a在光标后;I跳行首,A跳行尾;o在下一行,O在上一行
3、命令模式
进入命令模式:“:”或“/”
"/":进入搜索,n向下跳转到下一个结果,N向上跳转到上一个结果
“:":进入命令,w保存,wq保存退出,w!强制保存,q!强制退出;
//替换命令
:s/<查找项>/<替换项>/g;//将光标所在行的所有<查找项>替换为<替换项>
:%s/<查找项>/<替换项>/g;//将所有行的所有<查找项>替换为<替换项>
4、可视化模式
v 或 Ctrl + v;//进入可视化,v选行,Ctrl + v 选列
移动;//移动光标选择
Shift + i;//即"I"回到行首
输入字符;//可视化中选中的单元都会插入字符
ESC;//退出
(二)在vim中编程
1、安装vimplus
2、安装插件
3、安装编译器
sudo apt install gcc g++ gbd;//安装编译器
gcc <file.c>;//编译C程序
g++ <file.cpp>;//编译C++程序
./file.out;//执行生成的程序,注意要加'./'表示当前目录,否则默认去/bin目录下寻找文件
4、程序执行过程
//只进行部分过程的方式
gcc -E;//进行到预处理阶段.i文件,处理#的内容,这里不会对语法错误报错
gcc -S;//进行到编译阶段生成.s文件,进行一系列的词法分析,语法分析,语义分析以及优化,会对语法错误报错
as main.s -o main.o;//进行到汇编阶段生成.o文件,可以使用nm命令查看二进制文件
gcc main.o -o main.out;//进行到链接阶段生成.out文件
(三)生成库
1、生成静态库
//特点:***.a,一般以lib开头
gcc -c add.c -o add.o;//编译源代码
ar crsv libadd.a add.o;//将add.o打包称为静态库libadd.a
sudo cp libadd.a /user/lib;//将libadd.a拷贝到系统库中
gcc main.c -o main -ladd;//"-ladd"的作用是链接add
2、生成动态库
//特点:***.so,一般以lib开头
gcc -c add.c -o add.o -fpic;//"-fpic"选项是为了生成与位置无关的共享的目标代码
gcc -shared -o libadd.so add.o;//打包成为一个动态库,注意加了一个"shared"
sudo cp libadd.so /user/lib;
gcc main.c -o main -ladd;
附录
(一)常用安装软件
安装帮助手册:sudo apt install manpages-posix-dev
安装树状目录:sudo apt install tree
安装vim:sudo apt install vim(可以使用vimtutor练习操作方法)
(二)常用网站
Linux内核版本的网址:https://kernel.org/
Linux命令查询中文网址:https://wangchujiang.com/linux-command/
(三)常用软件包管理器
1.rpm
命令格式:rpm -参数 软件包名
参数 | 英文 | 含义 |
---|---|---|
-q | query | 使用询问模式,当遇到问题询问用户 |
-a | all | 查询所有软件包 |
-i | info | 显示软件包的概要信息 |
-l | list | 显示软件包中的文件列表 |
-f | file | 显示文件对应的软件包 |
-e | erase | 卸载软件包 |
-e -nodeps | 卸载前跳过依赖检查 |
安装命令:rpm -ivh 软件包名
参数 | 英文 | 含义 |
---|---|---|
-i | install | 安装 |
-v | verbose | 打印提示信息 |
-h | hase | 显示安装进度 |
2.yum
命令格式:yum [options] [command] [package]
命令 | 含义 |
---|---|
yum check-update | 检查是否有升级 |
yum update | 升级软件(没有则安装) |
yum install | 安装软件 |
yum list | 列出可安装软件清单 |
yum remove | 删除软件包 |
yum search | 查找软件包 |
yum repolist all | 列出当前可用仓库 |
yum clean all | 清除仓库缓存 |