前言:Linux被广泛运用于服务器当中,是一个主要面向企业、开发者的一个操作系统,因此这个操作系统几乎对于开发者来说是必须要学习的。这里我用的版本是CentOS 7.6 64(后面可能会换)
1.Linux的发展历史与简介
对于大多数的普通用户来说可能只听过两个操作系统:Windows和Mac OS ,但却很少听说过Linux这个操作系统,这个操作系统并没有像那两个操作系统一样为用户提供了形象成熟的图形化界面,最多就一个黑乎乎的终端,想要操作这个系统还要输一堆乱七八糟的指令这让这个操作系统对于普通用户来所并不友好,但是对于开发者来说则是几乎必须要掌握的操作系统
1.1Linux的前世今生
最早诞生的操作系统并不是以上三个中的任何一个,而是一个叫做Unix 的操作系统,这个操作系统诞生于贝尔实验室(也是C语言和C++诞生的地方),Unix系统虽然在当时很强大,但是太贵了,普通的学生和开发者都用不起。

理查德·斯托曼为了打破这种商业垄断,发起了 GNU 计划,目标是编写一套完全自由、开源的类 Unix 操作系统。到了 90 年代初,GNU 已经开发出了强大的编译器(GCC)、文本编辑器等大量软件,万事俱备,只欠一个系统内核
直到1991年8月,历史迎来了转折点。芬兰赫尔辛基大学的 21 岁大四学生林纳斯·托瓦兹(也就是Linu之父),因为嫌弃学校里的 Minix 系统不好用,决定自己写一个内核(吓哭了,也许这就是大佬吧)

1992 年inus做出了一个的决定:将 Linux 内核的开源协议修改为 GNU GPL。这让全世界的极客都能参与贡献代码(这也是为什么Linu为什么屹立不倒的重要原因),并且 Linux 内核完美填补了 GNU 计划缺失的那块拼图。GNU 的应用软件 + Linux 的内核 = 我们今天使用的完整操作系统
如今,Linux 运行在全球最快的 500 台超级计算机上,统治了绝大多数的云服务器和互联网基础设施,甚至你我口袋里的安卓手机,其底层也是基于 Linux 内核的
1.2Linux简介
Linux是一款免费、开源、多用户的操作系统,我们常说的Linux分两部分:内核 和发行版 。Linux 严格来说只是一个"内核"。内核就像汽车的发动机,负责管理 CPU、内存、硬盘等硬件资源,但光有发动机是没法开上路的,所以发行版就像是一辆"整车"。不同的社区或商业公司,把 Linux 内核拿过来,装上图形界面(外壳)、各类应用软件(座椅音响)、包管理器,就成了我们在用的系统。因此Linux会有各种各样的版本,不同的版本都有各自最适合的领域
1.3Linux的设计哲学
在Linux中有两个非常经典的思想:
-
"一切皆文件": 在 Linux 眼里,没有 C盘、D盘,甚至没有打印机、网卡的概念。普通文档是文件,目录是文件,键盘鼠标等硬件设备也是映射在 /dev 目录下的文件。这种设计让系统对各种资源的管理变得高度统一
-
天生的多用户与多任务: Windows 最初是作为个人电脑设计的(一个人用),而 Linux 从娘胎里出来就是为了网络和服务器设计的。它可以让成百上千个用户同时通过网络登录到同一台机器上,各自运行自己的程序,互不干扰
1.4Linux为什么对开发者重要
说了这么多为什么要学习Linux呢?除了用来装B外你在本地如Windows上写好的代码,最终大概率要部署在 Linux 服务器上运行。不懂 Linux,就无法进行环境配置、排查线上 Bug。尤其是对于C/C++方向非常重要

2.Linux的常用基本指令
我这里的环境就统一为CentOS 7.6 64 下的root 用户来作为演示
帮助指令man与tree
man 指令:
- 作用:Linux 下的帮助手册,用于查看指令、系统调用或 C 语言标准库函数的帮助手册。
- 安装:我用的是租的云服务器,有些服务器可能没用默认安装完整的C标准库、系统调用手册。如果你也是云服务器执行下面的指令就好:
bash
yum install -y man-pages man-pages-overrides
- 演示:比如我想要查找scanf函数的作用:
bash
[root@VM-0-5-centos ~]# man scanf
运行结果:

tree指令:
- 作用:作用: 以树状图的形式直观地列出目录结构。这对于查看复杂的工程代码结构非常有用
- 安装:有些服务器上可能默认没用安装,执行下面的指令安装下就好:
bash
yum install -y tree
- 演示:比如我这里想查看root目录下的结构:
bash
[root@VM-0-5-centos ~]# whoami
root
[root@VM-0-5-centos ~]# pwd
/root
[root@VM-0-5-centos ~]# tree /root
/root
|-- airone
| |-- a
| | `-- b
| | `-- c
| | `-- d
| `-- test.c
`-- mydir
|-- hello.txt
`-- world.txt
6 directories, 3 files
clear指令与whoami指令
clear指令:
- 作用: 清除当前终端屏幕上的所有信息,让界面恢复整洁
- 小技巧:在日常敲代码时,可以直接使用快捷键 Ctrl + L效果与输入 clear 完全一样,非常的好用
- 使用:
bash
[root@VM-0-5-centos ~]# clear
whoami指令:
- 作用:顾名思义"我是谁",用于显示当前登录系统的用户名。在排查权限问题时,我们经常需要先确认自己当前是什么身份
- 演示:我这里是以root用户登陆的:
bash
[root@VM-0-5-centos ~]# whoami
root
ls相关指令
ls就是list的缩写用于列出指定目录下的文件和子目录信息,我这里主要介绍几个常用的,剩下的这里我就贴个表格:
| 选项 | 作用 | 示例 |
|---|---|---|
-i |
显示文件的 inode(i节点)编号 | ls -ai file |
-k |
以 KB(K字节)为单位显示文件大小 | ls -alk file |
-n |
使用 UID、GID 数字代替用户名和组名显示 | ls -ln |
-F |
在文件名后追加文件类型标识符 | ls -F |
-r |
反向排序显示 | ls -r |
-t |
按修改时间排序 | ls -t |
-s |
显示文件大小(块数) | ls -s |
-R |
递归显示所有子目录中的文件 | ls -R |
-1 |
每行只显示一个文件 | ls -1 |
ls常用参数:
-l:显示文件的详细信息(ll是ls -l的常用简写形式,非常方便)-a:显示所有文件,包括以 . 开头的隐藏文件-d:将目录当作普通文件显示,而不是显示目录中的内容
演示:
bash
[root@VM-0-5-centos ~]# pwd
/root
[root@VM-0-5-centos ~]# ls -l
total 8
drwxr-xr-x 3 root root 4096 Jun 4 04:00 airone
drwxr-xr-x 2 root root 4096 Jun 4 04:41 mydir
[root@VM-0-5-centos ~]# ls -a
. .bashrc .pip
.. .cache .pydistutils.cfg
airone .config .ssh
.bash_history .cshrc .tcshrc
.bash_logout mydir
.bash_profile .npmrc
[root@VM-0-5-centos ~]# ls -d
.
一个文件不是仅仅只有内存,它还有它对应的属性:目录 == 属性 + 内容,我们对文件进行操作要么是对内存进行操作要么是对属性进行操作:

修正:r开头应该说是普通文件才准确
cd指令
在Linux中一切皆文件,所以Linux的系统结构就像是一个从根目录开始的多叉树一样:

我们可以把Linux想象成我们之前在数据结构那里学过的树,其中叶子结点就是普通文件或者目录 而非叶子结点就是非空目录。因此到达这棵树上的任意一个结点我们可以认为有两种路径:
- 绝对路径:从根结点开始,唯一确定的路径
- 相对路径:以非根节点为参照,因为到目标结点,这也是我们平常在cd指令用得比较多的路径
接下来说回我们的cd指令:
- 作用:
cd就是Change Directory的缩写,用于切换当前工作目录 - 语法:
cd 目录名 - 常用指令集:
cd ~或直接cd:回到当前用户的家目录(root 用户的家目录是 /root)cd ..:返回上一级目录cd -回到上一次所在的目录(在两个相距很远的目录间来回切换时极其好用)cd /直接进入系统的根目录
- 演示:
bash
/root
|-- airone
| |-- a
| | `-- b
| | `-- c
| | `-- d
| `-- test.c
`-- mydir
|-- hello.txt
`-- world.txt
6 directories, 3 files
[root@VM-0-5-centos ~]# cd ~
[root@VM-0-5-centos ~]# pwd
/root
[root@VM-0-5-centos ~]# cd ..
[root@VM-0-5-centos /]# pwd
/
[root@VM-0-5-centos /]# cd -
/root
[root@VM-0-5-centos ~]# cd /
[root@VM-0-5-centos /]# pwd
/
[root@VM-0-5-centos /]#
其中/在Linux中既可以表示Linux的根目录 也可以表示地址分隔符 ,cd后面可以跟绝对路径当然也可以跟相对路径我这里就不多演示了
touch指令
主要用于快速创建一个空白文件。如果该文件已经存在,则会更新该文件的修改时间(时间戳)
- 语法:
touch [选项]... ⽂件... - 演示:比如我这里想要在mydir目录下创建一个
helloworld.c的文件只需要:
bash
[root@VM-0-5-centos mydir]# pwd
/root/mydir
[root@VM-0-5-centos mydir]# ls
hello.txt world.txt
[root@VM-0-5-centos mydir]# touch helloworld.c
[root@VM-0-5-centos mydir]# ls
hello.txt helloworld.c world.txt
[root@VM-0-5-centos mydir]#
当文件已经存在时我们就改变这个文件的时间属性:
bash
[root@VM-0-5-centos mydir]# ll
total 8
-rw-r--r-- 1 root root 30 Jun 4 04:40 hello.txt
-rw-r--r-- 1 root root 0 Jun 16 18:10 helloworld.c
-rw-r--r-- 1 root root 30 Jun 4 04:41 world.txt
[root@VM-0-5-centos mydir]# touch hello.txt
[root@VM-0-5-centos mydir]# ll
total 8
-rw-r--r-- 1 root root 30 Jun 16 18:12 hello.txt
-rw-r--r-- 1 root root 0 Jun 16 18:10 helloworld.c
-rw-r--r-- 1 root root 30 Jun 4 04:41 world.txt
[root@VM-0-5-centos mydir]#
mkdir指令
- 作用:这个指令是用来创建新的目录(文件夹)
- 语法:
mkdir [选项] dirname... - 常用参数:
-p递归创建多级目录。如果父目录不存在,会自动一并创建,不会报错 - 演示:比如我这里想在root目录下创建一个新的目录dirtwo:
bash
[root@VM-0-5-centos ~]# ls
airone mydir
[root@VM-0-5-centos ~]# mkdir airtwo
[root@VM-0-5-centos ~]# ls
airone airtwo mydir
或者是在dirtwo下创建多个叠加的目录a/b/c/d:
bash
[root@VM-0-5-centos airtwo]# pwd
/root/airtwo
[root@VM-0-5-centos airtwo]# mkdir -p a/b/c/d
[root@VM-0-5-centos airtwo]# tree .
.
`-- a
`-- b
`-- c
`-- d
4 directories, 0 files
rmdir与rm指令
rmdir 指令:
- 作用:删除空目录
- 语法:
rmdir [-p] [dirName] - 常用选项:
-p当子目录被删除后如果父目录也变成空目录的话,就连带父目录一起删除 - 局限性:只要目录里有任何文件或子文件夹,它就会报错拒绝删除。因此在实际开发中出场率不高
- 演示:如果文件夹 d 是空的:
bash
rmdir d
如果 d 里面有文件 / 子目录,必须用 rm -rf
bash
rm -rf d
rm指令:
- 作用:删除文件或目录
- 语法:
rm [-f-i-r-v] [dirName/dir] - 常用选项:
- -r:递归删除,用于删除整个非空目录及其内部所有内容
- -f:强制删除,不进行任何确认提示(我这里是root用户所以总是会弹出确认,这个时候就可以用这个)
- 演示:比如我这里想要一下子删掉airtwo:
bash
[root@VM-0-5-centos ~]# tree /root
/root
|-- airone
| |-- a
| | `-- b
| | `-- c
| | `-- d
| `-- test.c
|-- airtwo
| `-- a
| `-- b
| `-- c
| `-- d
`-- mydir
|-- hello.txt
|-- helloworld.c
`-- world.txt
11 directories, 4 files
[root@VM-0-5-centos ~]# rm -rf airtwo
[root@VM-0-5-centos ~]# tree /root
/root
|-- airone
| |-- a
| | `-- b
| | `-- c
| | `-- d
| `-- test.c
`-- mydir
|-- hello.txt
|-- helloworld.c
`-- world.txt
6 directories, 4 files
cp指令
- 作用: 用于复制文件或目录
- 语法:
cp [选项] 源文件或者目录 目标文件或者目录 - 注意事项:如果同时指定两个以上的文件或者目录,并且最后的目的地是已经存在的目录,则会把前面指定的所有文件或者目录复制到此目录中
- 常用选项
-f强制覆盖,如果目标已存在则会覆盖-i目标文件已存在时就会询问是否覆盖
演示复制文件:
bash
[root@VM-0-5-centos ~]# cd ./mydir
[root@VM-0-5-centos mydir]# ls
hello.txt helloworld.c world.txt
[root@VM-0-5-centos mydir]# cp helloworld.c test.c
[root@VM-0-5-centos mydir]# ls
hello.txt helloworld.c test.c world.txt
复制目录:
bash
[root@VM-0-5-centos ~]# ls
airone mydir
[root@VM-0-5-centos ~]# cp -rf airone cpairone
[root@VM-0-5-centos ~]# ls
airone cpairone mydir
[root@VM-0-5-centos ~]# tree /root
/root
|-- airone
| |-- a
| | `-- b
| | `-- c
| | `-- d
| `-- test.c
|-- cpairone
| |-- a
| | `-- b
| | `-- c
| | `-- d
| `-- test.c
`-- mydir
|-- hello.txt
|-- helloworld.c
|-- test.c
`-- world.txt
11 directories, 6 files
我这里就不演示完了,指令这东西用得多了就会了
3.总结
Linux的指令实在是太多了,还有各种各样的小细节存在我这里只是介绍了下常用的几个指令,上手一个新的系统总是痛苦的尤其是习惯了以前用的傻瓜式的win系统老是感觉很难受。只要还是要多用,时间久了或许有一天能真正上手这个操作系统吧