爆笑教程  《看表情包学Linux》 猛戳订阅  

 

写在前面

本章将浅谈一下 “操作系统是什么” 的问题,随后通过讲解一些 Linux 下的基本指令,显示目录内容、跳转操作和文件的创建与删除。在讲解的同时我会穿插一些知识点,比如 Linux 隐藏文件、路径等基础知识。


Ⅰ. 瞭解操作系统

0x00 引入:什么是操作系统?

在任何一本教材上,都可以看到操作系统的定义。

这些定义虽然没什么问题,但是对于初学者来说理解起来还是会一脸懵的。

 我们将通过一些简单的例子,带着大家去理解 “什么是操作系统” 。

我们不妨先思考几个问题:

❓ 思考:先有鸡还是先有蛋?是先有计算机(硬件)还是先有操作系统呢?

答案是先有计算机,换言之操作系统是在有了计算机后诞生的产物。

❓ 思考:为什么要有 OS ?( * 注:操作系统我们一般称为OS,本博客OS一般指的是操作系统)

因为单纯的硬件计算机操作起来效率特别低,难度特别高。是为了降低计算机的使用难度的。

思考:显示器是硬件吗?

是的,printf、cout (软件)向显示器打印,本质就是向硬件写入数据(硬件)。

0x01 操作系统的基本概念

也就是说,软件实际上是可以操作硬件的,那这个操作具体是怎么完成的呢?

 在我们计算机的整个结构中,最底层我们称之为 “硬件” 。

所谓的硬件就是键盘、显示器、网卡、显卡等各种设备……在底层它们都叫硬件。

这些硬件之间的组织方式,我们放到下一章讲解 “冯诺依曼” 再讲解。

 所以我们得到一个既定的事实:软件在操作硬件!

 在硬件层上还存在着一个软件层,我们称之为 “驱动软件层” 。

我们可以通过驱动软件层帮上层实现对硬件的基本访问。

每一种硬件都有一种与之匹配的驱动程序。

举个例子,不知道大家有没有这样的操作经历 —— 我们在 Windows 中使用鼠标,鼠标没有插入计算机中时我们滚动鼠标时没有反应的,但当我们把鼠标插入到USB接口中的一瞬间,此时滚动可能还是没有反应的(当然,现在鼠标的响应已经时间短的让人难以察觉了),即使鼠标在物理上已经插入到计算机USB接口中了。大概过了几秒电脑驱动提示音响了一声,此时鼠标就和电脑相连接了。

当我们往我们的计算机新增一个设备时,刚开始插入的时候短暂期间其实都是没有反应的,过了一会它就有反应了,这个 “过了一会” 操作系统在做什么呢?

操作系统在根据你的硬件帮你选择对应的驱动程序。也就是说,它的核心工作是能够给上层提供访问硬件的接口,就好比你自己写C++代码,你封装一个类,类里面封装了各种成员方法,我们这么做不就是想让我们定义出来的对象可以使用类中定义的成员方法来进行操作吗?所以我们写类写方法就是为了让类给我们提供接口。

一般而言,一种硬件都会有厂商给我提供对应的驱动软件,获取驱动的方式,一般而言是由 OS 帮我们继续宁获取与安装的。这些对用户来说是透明的。

驱动软件层:帮上层实现对硬件的基本访问。

再往上,还有一层软件层,我们一般把它称之为 (操作系统内核)。

 狭义上讲,这个就是我们的操作系统。

 操作系统的内部它一般会有四大构成:① 进程管理  ② 文件管理  ③ 内存管理  ④ 驱动管理。

操作系统的核心工作是帮助我们进行这上面这些内容的管理工作。

再再往上就是 “用户层” 了,比如我们的图形化界面、各种库,用户的一些应用程序等。

0x02 什么是操作系统?

 我们现在再去看刚才的问题,为什么要有操作系统?

 ① 对下要管理好底层的软硬件资源。

② 对上给用户提供一个良好的、稳定的、高效的运行环境。

打个比方,你 CSGO 打的好好的,打个五分钟电脑都卡死重启,打着打着就关机。

 而且动不动还蓝屏一下,这还玩个锤子,毫无游戏体验啊!

我们提了这么多,这些都可以归结成一个词 —— 管理

管理的目的:① 对上:提供一个良好稳定的运行环境    ② 对下:管理好软件资源。

从而整体达到提高操作效率的目的,这就叫操作系统。

  欸,软件管理软件,这合理吗?

人管人,软件管理软件有啥奇怪的,这有啥不合理的,这很合理。

总结:OS 是一款软件,用来进行对软硬件资源进行管理的软件。

❓ 好,操作系统我知道是什么了,那什么是   操作系统呢?

这就如同现实中我们有中国银行、中国建设银行、中国农业银行……

我们的操作系统也有不同的种类, 、  ……

 实际上,   操作系统也就是操作系统的一种罢了,

不管它有多么特别,它最终都是围绕我们刚才所说的 “向上和向下” 展开的。

0x03 引入:为什么要进行指令操作?

 不废话,我们先说结论 ——

指令操作对于非专业人员,没有必要。对于专业人员,可以必要,也可以不必要。

但是,对于我们学习 OS 原理、编程、指令操作,必须需要掌握。

❓ 用图形化界面不香吗?是先有指令,还是现有图形化界面?

 早期的操作系统,是键盘给OS、计算机数据的。

如何输入数据给计算机?打字机 → 计算机键盘(从打字机演化过来的)

你有没有想过,为什么我们键盘上是按 QWER 的顺序,还不是 ABCD 去排列的?

其实是历史原因导致的,这是根据使用频率去设计的。

先有指令操作。所有的操作系统,刚开始的时候全部都是支持指令操作的。

如果你对计算机图形化的内容感兴趣,可以百度了解了解。

我们的  也是有指令操作的,也就是 cmd 命令提示符:

显著的缺点就是操作成本高,所以当时操作系统公司为了 “取悦” 用户,都去开发了图形化界面。

❓ 我们再回到问题本身:那我们为什么要学习指令呢?

因为指令操作距离 OS 更近,便于我们更好地掌握 OS。所以我们学习指令除了学习指令本质外,我们更是为了接近操作系统的特性。

Ⅱ. 目录内容的显示

0x01 ls 指令

ls [选项] [目录或文件]

ls :显示当前目录下所有文件

      ① 对于目录,该命令列出目录下的所有子目录与文件。

      ② 对于文件,将列出文件名以及其他信息。

常用选项:

  • -a  列出目录下的所有文件,包括以 . 开头的隐含文件。
  • -d  将目录像文件一样显示,而不是显示其下的文件。如:ls -d 指定目录
  • – i  输出文件的  结点的索引信息。如: ls -ai 指定文件。
  • -k  以  字节的形式表示文件的大小。ls -alk 指定文件。
  • – l  列出文件的详细信息。
  • -n  用数字的  代替名称。
  • -F  在每个文件名后附上一个字符以说明该文件的类型。” * ” 表示可执行的普通文件, ” / “表示目录, ” @ ” 表示符号链接; ” | ” 表示 FIFOs; ” = ” 表示套接字(sockets)。(目录类型识别)。
  • -r   对目录反向排序。
  • -t   以时间排序。
  • -s  在 l 文件名后输入该文件的大小(大小排序,如何找到目录下最大的文件)。
  • -R  列出所有子目录下的文件(递归)。
  • -1   一行只输出一个文件

我们来输入个 ls 看看:

因为当前目录确实什么文件都没有,如果我们想看 ls 的效果,我们用 touch 先创建一个文件。

 ( touch 命令我们后面再说,这里先用一下方便演示 ls 的效果)

$ touch mytest.c

之后我们再输入 ls,就可以显示当前目录下的文件,我们刚才创建的 mytest.c 文件了:

 当然,我们也可以用 ls 直接查看到一些目录文件。

我们现在还没有目录,我们先用 mkdir 创建出一个目录出来:

(这个目录就相当于 Windows 下的一个文件夹,我们先可以这么理解。下面再说这里先测 ls )

$ mkdir code

  注意事项:我们在输入指令的时候一定要把空格带好,不要出现这种情况:

❓ 显示当前目录下,我们当前目录是谁呢?如何知道?输入 pwd 显示当前路径:

$ pwd

 

(我们讲一个 ls 补充了这么多指令,就是为了做一个 ls 的演示,相当于是一个 “起手式” 。只是为了能快速操作起来,我们下面还要对我们刚才提前用到的指令详细介绍一下。)

0x01 常用选项:ls -l

下面我们要来认识一下 “命令的选项”

指令是可以带很多选项的,比如默认情况下输入 ls 是只显示文件的,

但是输入 ls 带上 -l ,就可以显示出更多的文件属性。

ls -l :显示文件更多的属性

$ ls -l# 显示文件更多的属性

0x02 Linux 隐藏文件 

❓ 思考:如果我们在 Windows 下创建了一个空文件(0kb)在磁盘中占据空间吗?

要占用,文件有属性数据,属性数据是数据吗?当然是!

 (文件是有属性的)

 我们曾经或者将来的所有文件操作,无非两类:

① 对文件的内容操作

② 对文件的属性操作

结论:文件 = 文件内容 + 文件属性

所以 ls -l 显示文件的更多属性,这里面的这些属性都代表了文件的某一种属性。

0x03 ls -a 选项

ls -a : 显示 Linux 系统中的隐藏文件

列出目录下的所有文件,包括以 . 开头的隐藏文件。以点开头的文件我们称之为隐藏文件。

$ ls -a# 显示Linux系统中的隐藏文件

隐藏文件? 下其实也有隐藏文件,感兴趣可以自己搜搜看。

既然有隐藏文件,那我们是不是也可以创建出隐藏文件呢?当然可以:

当然,我们还可以复合使用,比如 ls -a -l

ls -a -l :显示 Linux 系统中的隐藏文件的更多属性

$ ls -a -l$ ls -al

 0x04 当前路径与上级路径( . 和 .. )

 其实,任意目录下都会存在两个隐藏文件:

. (当前路径)..(上级路径)

它们都是以 . 开头的。如果我们想回到上级路径,该如何操作?

很简单,只需要输入 “退!退!退!” 就行 ——   (bushi)

退个锤子,这里我们要使用一个叫 cd 的指令!(change dir,即更改路径)

cd ..  :回到上级路径

$ cd .. # 回到上级路径

 (记得输入pwd看看在哪)

 诶,我们再 cd ..  pwd 一直重复,最后会回到哪里呢?

 思考: /home/foxny  是什么呢?

这是 Linux 路径,和 Windows 下的路径一样:

D:\360MoveData\Users\Chaos\Desktop\OllyDBG\plugin

 而这个 \ 就是传说中的路径分隔符!

Windows 的路径分隔符是 \  ,而 Linux 的路径分隔符是

❓ 思考:我们到 / 里了,该如何回去呢?(即回到 /home/foxny )

当我们回到 / 时,就不能再进行回退了,这和 Window 下一样,一直返回返回到头,图标变灰:

不能回退时剩下的这个 / 我们不称之为路径分隔符,我们称之为 根目录

而回到路径的方式,我们可以直接 cd + 路径:

$ cd/home/foxny

 (至于根目录的更多内容,我们一会讲 cd 命令的时候再细说)

哈哈哈哈,值得吐槽的是 —— 我们是如何扯这么远的呢?

我们再讲 ls -a 选项,由 -a 选项扯到了隐藏文件,然后又由 . 开头的隐藏文件引申到 .. ,

讲到当前目录和上级目录,又引申到了 cd.. 回退,由回退再引申到了路径分隔符和根目录……

 咳咳,我们再继续讲解当前路径。

❓ 思考:那当前路径 .  ,这一个点,有什么用?

我们在上一章试着写 Hello Linux 时,当时就用到了 ./a.out

  ls 的其他常用选项,这里就不再逐个演示了。

我们对于 ls 用的最多的选项就是 ls -a -l ,其他的选项目前为止只需要有个印象即可。

对于指令的态度:必须记住,但不是现在。忘掉很正常,不需要专门下来背指令。我们也不用可以得去记,不懂就查就行,查多了自然就熟了。

Ⅲ. 目录的跳转操作

0x00 引入:Linux 目录结构的本质

  我们刚才已经用过 cd 命令了,现在我们来正式的谈一谈这个命令。

❓ 思考:Linux 入口目录时 / 根目录,请问根目录可以再放一个目录吗?

Linux 的目录结构本质是一个多叉树。所以我们把 / 称为根目录,是路径的起始。

在数据结构的角度去理解:

① 既然是一颗多叉树,每一个子节点既可以是一个目录(再放目录或普通文件,递归式的定义),也可以是一个普通文件。

② 这颗多叉树的叶子节点一定是一个普通文件或者是空目录。

 我们一般 “定位” ,是通过路径定位的方式找到文件的。

❓ 思考:为什么我们都是通过路径方式定位文件的呢?

如果我们想找到我们曾经写的 test.c 文件,我们可以从 / 到 home 到 foxny 再到 test.c。

任何一结点,可以有多个子节点。但是任何一个子节点,都只有一个父节点。

所以 test.c 只有一个父节点,即 foxny …… foxny 也只有一个父节点,即 home……

所以当我们定位路径时,反向回推时,这条路径时具有惟一性的。

因为常规的路径定位是具有惟一性的。

0x01 绝对路径与相对路径

/home/foxny/test.c : Linux 下的 “绝对路径” (惟一性且永远有效)。

相对路径:相对于我当前所处的路径。

相对路径往往相对于当前位置,容易失效。而绝对路径是永远有效的!

如果是日常使用,我们推荐相对路径 —— 因为简单。

如果是进行添加配置文件之类的,推荐绝对路径 —— 因为不会出错。

结论:cd 命令后面可以跟上任何以绝对路径或相对路径构建的路径。

0x02 pwd 指令

 这个指令我们刚才已经用过了,没有比这个指令还要简单的指令了。

 pwd:显示用户当前所在的目录

$ pwd # 显示用户当前所在的目录

0x03 cd 指令

我们再讲几个 cd 指令的快捷方式:

$ cd ~# 跳转到当前用户的家目录 ~: 表示home

 这里的 ~ 就是一个快捷进入我们工作目录的方式。

默认一个用户在登录时,都是处于该用户的家目录中的。

一个普通用户的家目录一般都是在 home 路径下有一个以你名字命名的文件夹。

如果是 root 用户,它会在根目录下的 root 目录下。

(关于 root 和普通用户的差别,我们在后面的权限章节会详细讲解)

$ cd /# 跳到根目录$ cd -# 跳转至上一次我所处的路径

Ⅳ. 基本创建操作

0x00 touch 指令

touch [选项]... 文件...

touch:创建文件

touch 命令参数可更改文档或目录的日期时间,

包括存取时间和更改时间,或者新建一个不存在的文件。

 touch 常用选项:

  • -a   或 –time=atime–time=access–time=use :只更改存取时间。
  • -c   或 –no-create :不建立任何文档。
  • -d   使用指定的日期时间,而非现在的时间。
  • -f    此参数将忽略不予处理,仅负责解决 BSD 版本 touch 指令的兼容性问题。
  • -m  或 –time=mtime –time=modify :只更改变动时间。
  • -r    把指定文档或目录的日期时间,统统设成和参考文档或目录的日期时间相同。
  • -t    使用指定的日期时间,而非现在的时间。

本章我们只讲 touch 普通用法,我们不去讲它的常用选项。

本章只需掌握 touch 的最普通的用法,即用 touch 来创建普通文件。

(对于 touch 修改文件时间等用法我们放到讲开发工具 makefile 的时候再讲)

动手操作:

touch 创建一个 mytest.c     ② 使用 nano 写一个 Hello,Linux!      ③ gcc 编译

具体操作步骤如下:(nano —— Linux 中的文本编辑器)

如果你没有 nano,切换至 root 账户,输入以下指令进行安装:

# yum install -y nano

 如果你没有 gcc,切换至 root 账户,输入以下指令进行安装:

# yum install -y gcc-c++

0x01 mkdir 指令

mkdir [选项] [目录名]# 创建目录

mkdir:创建目录

mkdir 常用选项:

  • -p, –parents  可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录。

对于 mkdir 的命令,本章只需要掌握这两个就够了:

Ⅴ. 基本删除操作

0x00 rmdir 指令

rmdir :删除非空目录

rmdir [目录名]

 注意!rmdir 只能删除空目录!

0x01 rm 指令

  rm :删除普通文件

rm [文件名] # 删除普通文件

如果我们想删除一个目录:

如果像删除一个目录我们可以通过 ” -r 递归式删除 “

$ rm -r [目录名]# 递归删除目录文件

0x02 rm -rf 强制删除

rm -rf 强制删除

rm 还有一个选项, -r 表示递归,还可以带一个 f (force,即强迫)

$ rm -rf [目标]# 强制删除

有时候我想删一个文件,系统会提示你 “你确认吗?”

 我们带一个 -f,  意思就是说 —— “我非常确认!你不要给我提示了!”

注意事项:不要在 root 下输入:

# rm -rf /

你的系统有可能会挂掉,即便没有挂,它它会从根目录开始递归把能删的都删了。

(如果你想试,且你现在也没啥文件,可以试试,就算挂掉了,去云服务器后台重启就行)

 [ 笔者 ]   王亦优 [ 更新 ]   2022.7.4❌ [ 勘误 ]   /* 暂无 */ [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,本人也很想知道这些错误,恳望读者批评指正!

参考资料 

C++reference[EB/OL]. []. http://www.cplusplus.com/reference/.

Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

百度百科[EB/OL]. []. https://baike.baidu.com/.

比特科技. Linux[EB/OL]. 2021[2021.8.31 xi