00:00
好,那接下来我们讲的内容又是一个面试的重点。所以你们拿出宝典是吧,准备记录。那接下来我们要讲一个概念呢,叫链接。在Linux中有两种链接,一种呢叫硬链接,还有一个叫软链接,或者叫符号链接。这两个呢,是经常在面试题里面会问到的,问你两者之间有什么区别?那接下来咱们就来说说什么叫硬链接以及软链接。啊,我们先说硬链接。所谓硬链接。本质上就是同一个文件起多个名称。就像一个人。
01:02
虽然你的身份证号只有一个。但是相信大家应该有很多小名啊。别名啊啊,你在什么各种号啊是吧,在古代的时候不是有那个有有有什么号名,反正各种称呼死了以后还有异号啊,这个这个称呼比较多。啊。当然,那这个链接说的就是类似的,我们允许在一个文件中起多个名称。那么如何实现呢?我们可以通过一个命令叫LN的命令,LN实际上是link的英文单词缩写。大家现在发现Linux的命令都是缩写。Link就是那个链接的意思。那我们可以通过link命令来创建。
02:00
硬链接,它也可以创建软链接,我们先说硬链接的事儿。啊,我现在拷一个有数据的文件过来。我把这个文件给它覆盖了,好大家看我这有一个F1文件。它的大小三零九,它的节点编号是301。我用LN命令可以来创建它的硬链接,方法呢就是。我起个名字叫F11,那么这个F11就是F1的硬面机。那么它两者之间有什么区别?我们创建完比较一下。好,大家再来看一下它们有什么区别。你对比对比有什么区别?编号。有啥区别,而且在创建前和创建后有什么变化?仔细观察。
03:03
好,我们发现这两个除了名称不一样,其他全一样。发现了吗?节点编号也一样,我们把节点编号想象成人的身份证号,所以可以想象这两个人的身份证号都一样,你说能是不同文件吗?必须是同一个文件。只不过我们允许它有多个名字。是吧?啊,咱们同学在家里头可能有小小名啊,身边的人可能会用不同的称呼叫你是吧?咱们班是小明小红之类的同学还在吗?我一直对不上号。小红,小明在哪呢?举一下手啊,怎么这个怎么好几个呀,两个小红哈,是吧,还是两个小明啊。这个不成对也有问题啊,这个。这会产生冲突的啊。好,那刚才我们提到了文件名同名其他的。
04:05
啊,都是文件名是不一样的,其他都一样。啊,那同时我们发现一旦创建完硬电机以后,这个地方的数字变了。原来是一,现在变成二,那这个地方的数字实际上咱们称为链接数,称为链接数。这个链接数,这个数字,它的本质含义表示的就是同一个文件。有几个名称?都是131有几个名啊,俩名吗?所以变成二。原来131的只有一个F1T文件,所以因此它这个地方就是一理解了吗?就是一。所以链接数就能体现出来,你有几个相当于硬链接。既然这样,大家马上就想到了,那既然他们同同一个文件,因此我去改任何一个文件,比方说我把这个F1F11文件改了,那比方说我们这把这些内容给它删一些,就剩下两行,改了以后呢,我们再看一下。
05:18
大家发现没有,是不是两边都是一样的。都变了。你改任何一个文件,本质上改的就是对应的这个131这个文件,那么当然F1文件也是131,所以它本质上是不是就都变了。也就是说,通过两个名字访问到的是同一个数据空间。虽然F1和F11他们对应的存储在目录中对应的不是同一个,那什么意思呢?就是我们当前这是一个data目录。这个data塔目录呢,它的结构是这样的一个结构。Data这个目录,我们有一个data目录的原数据,其中有一个数据空间来存放data目录的数据,而data呢,这是个文件夹,所以它里面存放了原来存放了F1TEST的文件,然后它对应的131这个节点编号。
06:16
啊,那还有就是F2。现在你是不是又增加了个F11?那他就要再加个F11。对应的还是131。除此之外,我们在系统中这儿的131是不是我们原来写的这个链接数是一,现在把它变成二就行了。它指向的指针,比方说我们这有一个F1文件存放的数据,这是F1的数据,它是不是给指针指向这个F1的存放数据块。F11增加的只是这一点内容和更改了这个链接数。那么F1的文件的内容就在这个里面存放F1的这个一假设一兆的数据,这个数据呢,是只有一块的。
07:02
换句话说,我们不论创建多少个硬链接,磁盘上占用的空间。占用的是。一份空间。不会占两份的,就像你一个人,你起八个名字,不得你还是你一个人。是吧,你不是也吃一个一顿饭吗?啊,早中晚各自一对是吧,哎。所以。那这就是硬连接的本质。那既然这样,所以我们通过这个链接数。那现在我们就发现,当我们链接数一旦变成。一二涨了以后,现在如果我把原始的文件删了。大家想它发生了会带来什么结果?会带来什么结果?那我们把原来的文件删了,F11还在吗?那他还能访问吗?能啊,那么大家看这个131还在。
08:07
只不过它对应的是F11,所以现在大家发现没有,我们现在在删文件,实际上。真的把这个文件删了吗?更不删了,因为我们原来有两个,那你删只是删了个名而已,是不是相当于少了个名,少了个名,我还有别的名啊,我还有F1这个名啊,F11这个名啊。对吧,数据也不会删,而且数据在磁盘上占的空间也不会标识为可以被别人覆盖,因为他还在用。所以当一个文件有硬链接的时候。这时候你删这个文件非常快,因为它只是删了个名字,他甚至在空间上都不给你标注,说可被别的文件占用,所以这个是我们清理大文件的一个非常好的手段。什么意思呢,就是有的时候我们发现有一个文件很大啊,假设在生产中,有的时候呢,有些文件可能会达到什么啊记啊,甚至很大的文件,这时候你要把它直接删掉的话。
09:10
它也会比较产生比较大的磁盘。因为什么,他虽然说不会把彻底这个文件清掉,但是它会把这个文件占的空间,是不是要加标记,说可以被别的文件占用。所以这时候呢,你如果你直接贸然去删除一些特别大的文件,会带来比较大的磁盘IO。那么就会导致你的系统骤然特别繁忙,如果你服务器本身就很忙,突然来了一个大的操作,可能做不好,你的机器就崩了,死了。啊,那崩溃了,那正常业务就受影响了,所以如果就想清理一个大文件的话,还有一种方法就是给它创建一个什么硬链接。你创建个硬链接,把它创建完了以后。
10:00
创建一个链接之后,你再删除这个原始文件,因为它本身并没有做真的清理空间的操作,所以速度很快,它就成了理解了吧。清了以后,当然这个空间并没有释放啊,但是这个文件你想删的文件是不是就真的没了。名儿至少没了。对吧,然后呢,你再抽空慢慢的。把这个文件走时间给他清了就行了。啊,那么至少我们要删的这个文件已经没了。这不就行了吗?你的目标是要把这个文件删了?是吧?尤其我们后面讲删数据库的时候啊,当然删除数据库一般很少发生啊,删数据库的时候,如果一个数据库特别大,所谓的删库实际上就是删文件,如果你直接删,就有可能会带来系统特别繁忙,所以你可以考虑用这种方式把硬链接给它创建,完了,用删除硬链接的这种方式来删是速度就快了很多。
11:01
啊,这是一种。可以借鉴的思想,但是硬链接本质上它只是相当于增加了个新名。那么我们现在这样做。F1 f22和二这两个同时都是132的硬件接几个节点编号,那么这两个名称之间有没有主次之分呢?有没有主次之分呢?啊,我们是参考了F2,创建了F22,那是不是F2更重要,或者是它是主,F22是从地位呢?那事实上没有关系啊,就像你生活中你好几个名,哪个名都是你的名,对吧?只不过是你习惯有人用这个名访问你,有的人就用别的名字访问你。倒谈不上什么主次之分的。啊,这就是他的背后逻辑。啊,对于文件来讲呢,硬链接。用这个方法可以轻松实现,但是我们在创建的时候有可能会遇到这种问题,比方说我把它放到这儿了。
12:07
我把这个硬链接放在这个地方,我们再回车一下。发现出错了。这个命令出错了,为什么呢?那它这提示我们invalid cross device就是无效的跨设备链接,那什么意思?就是不能跨设备。啊,我这怎么跨设备了,我是不是跨分区了是吧?那我这个root这个文件夹在根里面,而 dataf2是在data这个独立分区中,这是两个不同分区啊,在跨设备了,那跨设备不允许,这是为什么不允许啊。为什么不让我创建?因为硬链接的本质,你先想清楚,硬链接的本质就是同一个文件,它有多个名称,你要跨了分区了,那还是同一个文件,那就违反了硬连接的。
13:00
它的初衷,它的原来的功能,所以硬链接不能跨分区跨设备,理解了吧,哎,它只能在一个分区的同一个或者不同的目录里面,这是可以的。不能跨设备。这个是它的本身工作逻辑决定的。所以硬链接它的使用是有一定的局限性的。除此之外,硬链接能不能针对文件夹来创建呢?比方说我们这有个第一啊,我们来看一下这个第一创建完以后,这些第一是新建的,诶大家可能惊奇的发现,第一怎么上来就是二啊。我创建第一的硬链接了吗?我是不是还没创建呀,我光创建了一个文件夹对不对,那这个地方怎么回事啊。那这个二是怎么来的,知道吗?哎,那二说明它有俩名。那第这个名字我们看到了,不就是这个。是吧,第一,那第二个名在哪呢?诶,那就是B1里面它有。
14:03
隐藏的这个点儿,这个点儿不也是他的名吗?任何一个文件夹里面都有点和两个点,所以任何一个文件夹新建的文件夹是不是至少都是二期?因为它原来有一个零,有一个比一点是不是也是它。所以至少都是二。当然,能不能让它变成三呢?有人说,那我创建个硬链接不就得了吗?那问题是,能创建硬链接吗?硬链接不支持对目录创建,因为如果支持了可能会出现循环,死循环,就是我这个第一里面嵌套第一第一第一这么嵌下去无穷无止了,所以它不支持啊,不支持不支持,那不支持,难不成这个页链接的编号就永远固定在二了吗?那事实上也不是,那我们现在可以看一下,如果我在第一的下面再建个第二,这时候你再来看,大家发现没有,第一就变成了三。
15:05
那这个三怎么来的,你知道吗?哎,对了,因为我们第一这是它的一个。名称,然后第一的里面有一个点是不是,哎,第一的里面有一个点,哎,而第二第二里面它有一个什么点点,第二的点点不就是第一吗。所以他就来到了三,理解了吧,所以这个二三怎么来的,是这么来的啊。那就是硬电机的特点。当然硬链接呢,因为诸多的局限,比方说不支持文件夹,也不支持跨设备,所以我们工作中用的不多。太有局限性了,我们更多的会用下面的软链接。软链接又成为符号链接。因为这两个都是S开头。所以我们恰恰用的这个命令呢,就是S加上杠,S就成了软连接了,不带S就是硬连接。
16:03
那么软链接怎么创建呢?非常简单,我们跟上一个S。啊,我们比方说我们就拿这个F2这个文件来说,我这儿给它创建一个F2。test.link吧,加上一个名字,诶大家看。我这他说什么F2。我看我这路径有吗。是吧,有像写错命令了,挑了个S啊,我说呢,这个LN啊,不是LSLN这个你们这这个挑后面去了,你不看前面前面错了啊。好来走好,那现在咱们来看一下,哎,你看这就是。软链接就创建出来了,当然大家可能发现它是L开头,这就是我们说的那个链接文件,那么这个链接文件呢?它和F2这个文件两个文件,显而易见它不是同一个文件。
17:09
颜色也不一样,属性也不一样,链接的节点编号也不一样。对吧,所以它和原来的文件不同。当然创建软链接之后,这个链接的原来的编号,原来人家是不是就是二类。原来人家就是二对吧,因为这不是有个F22嘛,这上面有一个链接,所以它是二,那么现在我创建了软连接之后,这个链接数并没有怎么样增长,还是原来的数字不会影响。而且硬链接和软链接还有什么区别呢?软链接它的节点编号都不一样,所以原链接它和原始文件不是同一个文件。那虽然不是同一个文件,但是我们可以通过。访问软链接来间接的去访问F2文件啊,当然这个F2文件因为是空的啊,所以没有内容,那我们往里写点东西,比方说我们把F2文件打开,比方说这个F2贝塔啊,随便写点东西,然后你再来看是不是看到内容。
18:17
也就是说,我们通过软链接可以间接的得到它指向的文件的内容。那它的这个工作特点呢,非常像咱们Windows里的快捷方式。快捷方式,相信大家也是很熟的。快捷方式是不是就是相当于提供了一个比较方便的访问方法,访问路径,我们可以把磁盘上某一个比较深的路径在桌面上放一个快捷方式,是不是以后我就点桌面快捷方式就可以访问了,省事?那么我们这个软链接就是起到这样的一个效果,当然既然是为了访问方便,那我放在同一个目录里,那就意义不大了,所以我们可以考虑呢,放在一个别的目录里啊,比方说我们在创建一个啊F2TEST。
19:04
那我能不能把它放在一个别的路径下呢?比方说我们放到贝塔这个F2,我放到这个入一下。这个F2。呃,test.link好,我再创建一个,创建完了以后呢,诶,我发现现在这个贝塔F2和root下的是不是跨分区跨设备了。他允许没报错啊,没报错,现在我去访问创建好的这个链接文件,那这个链接文件呢,我们看到它确实是链接文件颜色就能看出来,然后呢,我们去直接访问它,你看是不是最终就访问到了我们原来的文件的内容。没问题吧,诶。这个快捷方式的效果还是很明显的。啊,当然如果我把原始文件要删了的话。会不会影响,会不会影响我们软链接的使用,那大家想软链接它的大小你注意到了没有,它的大小和原始文件的大小有关系没有。
20:08
啊,你看软链接的大小和原始文件的大小有关系没有。你看原来的文件是零,而我这个软链接是六个字节。对吧,后来我把它改了,加了点东西,加了东西以后呢,那么这个原始文件的大小,现在看一看有多大。你看现在的文件是八个字节,而我这边的链接文件的大小。呃,是六个字节,是不是一直就没变,原来六个,现在还六个,所以换句话说,链接文件的本身大小和原始文件的大小无关。那无关它这个大小从哪来的呢?那就是它的路径来的,大家看这个地方的路径是六个字符,你发现吗。
21:02
是不是六个加上点。所以这个就是六,那你看下这个。这个是不是指向的这个路径加上斜杠的话,你数数有几个。12个,所以这是不是就是12个,当然怎么来的,你看啊,我选中以后,在屏幕左下角一松手看是不是有一个只复制12个字符,看见了吗?哎,那就是表示这12个,所以它就是12个,所以软链接的大小就是来自于它的路径,原始文件的路径大小。知道吧,它和原始文件的大小没有关系,它是路径的大小。啊好,这是咱们刚才说到的这样的一个特性,另外呢,我们刚才说了,如果我把原始文件删了,那再来看我们刚才针对F2创建的软链接,你再看。包括咱们root下的。发现都红了。是吧,红了一闪一闪的啊,这个说明是不是有问题了,对不对,为什么有问题了,是不是就是因为原始文件找不着了,那找不着了,那我们是不是就是这个链接文件也就失效了。
22:14
啊,所以原始文件和软链接文件,他们看来之间是有依赖性的吧,那谁依赖谁呀。当然是链接文件依赖于原始文件的存在,当然那原始文件找不着,那我创建一个,会不会把它再起个名字,比方说我换个新文件,换个新文件,这个文件不过呢,名字,我给它起个名字,就叫这个原来的F2,这行不行?这行不,虽然内容不一样,但是明儿我还是恢复了,这行不行啊,哎,大家看好像恢复了是不是,只要文件路径在,管你是不是原来的文件,反正都能访问了。解了吧,这就是软链接的逻辑。
23:01
软链接看来只关心路径,不关心你具体是什么是吧,哎,只要有这个东西就行了啊。有这个。软链接创建完之后,它能不能针对文件夹呢?那我们比方说这有个第一文件夹。那我给它创建到这个地方去,比如说叫第1LINK,看看文件夹,诶文件夹是不是也支持。文件夹也支持,所以这个就是它的一个好处啊,当然我们现在在第一里面建一个文件。第一里面建一个文件,然后现在我们在第1LINK这个目录下,是不是也能够看到刚才我们建的这个文件也没问题。啊,因为两个方法都可以访问,你通过原始文件的路径访问,或者通过软件机的路径访问都可以,不过呢,这个地方有一个问题,就是当我删除的时候。我删的时候呢,这个第1LINK这是一个软链接,这个删的时候呢,这个加不加斜线这个不一样。
24:06
如果你不加斜线。他删的就是链接本身的链接名。那如果你要加的是斜线。他删的是什么?你发现没有,他这个链接名没删,但是他把link里面的内容干掉了。所以多个斜线少个斜线对于软链接级来讲截然不同。记住了吧,所以千万小心啊,你要是加个斜线,它删的是软链接,指向那个文件夹里面的内容。链接不给你是。啊,所以别到时候删错了啊,比方说我就想把软链接删了,那如果你删软链接就不要删它的那个,不要加斜线删这个软连接本身。那它不会破坏里面的内容,那加热斜线那就惨了。
25:02
啊,所以而且这个斜线有的时候它是自动补的,你看不见,很多同学不是习惯自动补吗。一家看不见跟给你自动补个斜线,你一回车知道了吧。是吧,那你就只只可以跑路了,所以呢,有的时候千万要小心啊,看不见方便是吧,方便你就回家。啊,所以这个地方这时候需需要大家注意的,那还有一个地方就是我们在创建软链接的时候,我这给他再创建一次软件机。啊,我刚才是在root下创建了一个软链接,这个现在没问题,那我把这个root软链接的这个内容给它删了,我重新创建一次这个root下面现在没有软连接了,好,然后呢,我再创建一次F2TEST,我给它创建到root下叫F2TEST立好创建完了,创建完以后呢,我们再看一下下是不是生成了这个标。
26:03
呀,好像有点问题。那有没有同学告诉我原因?啊啊,有没有是什么原因啊。好,我看这个这个。聊天的界面。看看同学们。知道什么原因吗?嗯,你看我刚才创建的时候,这个命令有错误吗?没错。我现在就在当前目录下,这里面确实有个F2文件是吧?没错,那这指定的是我们链接文件的路径,也没错,这是相对路径是吧?这是绝对路径。必须得绝对路径。啊,那有人说你的意思说这个文件必须写寄给周静。是不是,那我们相对路径,那以前不都有相对路径吗。经常咱们既然我在这个目录下了这个文件夹里面的文件是不是写相对路径就完了,但是为什么这就好像有点问题呢?就是因为。
27:08
大家看它这个软链接,它的指针指向的是不是就是你这儿的路径,你这个路径没有写路径,没有写路径,大家想它相对路径,他认为这个F2是相对于谁的路径,是相对于这个创建的软链接的相对路径,而并不相当于你当前工作目录。所以换句话说,他认为F2这个原始文件和它在同一目录下理解了吧,所以我们这个文件是在root下,这个文件入下哪有F2,没有F2是吧,所以就是相对路径有问题了。那相对路径难道这有问题了,那怎么改成就没问题了呢?那我们可以通过有人说那简单写个绝对路径呗,啊这个我们再写一遍,F2,这个F2,呃呃,F2TEST link2吧,LINK2我们看看LINK2创建成功没成功,诶大家发现没有这个颜色对上了。
28:06
这是不是就是我们写了一个先绝对路径就可以了,因为他通过绝对路径其实不能找到F2,这就可以了啊,但是事实上非得是绝对路径,相对路径行不行啊,那当然相对路径,那我这要写相对路径应该怎么写啊?我再建个那个三,当然这个相对路径,现在大家明白了,相对路径不是相对于当前工作目录,而是相对于软链接这个文件的路径。听说吧,啊,所以那那你要这F2相对于它的路径应该咋写。是不是应该是是这个文件是在入下,那你要先回到根下吧,根下的data嘛。对不对,所以我们是点点,然后贝塔下的F是不是这么写好,那么现在我们创建完以后,再看这回那个三是不是成功了。
29:03
理解了吧,所以这回这个相对路径可不是我们以前常说的相对当前工作目录,而是相对于。软链接的相对路径。这个我们曾经说过,相对路径,在特殊场景下,它相对的是某些目录,而不是工作当前工作目录,大家记得吗?而且我还强调过。看来你们。不说话的同学看来是完全忘掉了。啊,咱们在前面讲这个相对路径的时候,我这有文字作证。是吧?啊,当然我这写了说一般情况用相当前公共公路,但这不现在出来二班情况了吗?对不对。好,所以这个内容现在就明白了,那硬链接和软链接的区别,相信大家现在可以总结了。
30:03
面试里面经常会问你说软连接硬连接有啥区别?这都是经典的面试题了。你现在能答出1234有几条?能总结出来吗?你自己脑袋里能过一过吗?啊,你大概自己数数1234有啥区别。你自己琢磨琢磨。我这做了个简单总结。实际上也并不全啊。只是简单说了一下八条。啊,你面试的时候答个五六条就可以,我觉得。啊,一般人可能答不了那么多。啊,当然你可以把这个东西直接复制到你的宝典里啊,啪啪啪,别到时候一面试,怎么你们答大家都一样,都是马出来的。
31:01
好,这个特点呢,我刚才已经随着给大家讲解,已经都说过了,这是个总结而已啊,你们下来可以自己看。当然有些东西也不一定,也就不是说全部啊,也许你还可以再加个第九条,第十条,比方说文件的大小,文件大小这是不是就没说呀。是吧,文件大小我再加一个。文件的大小。硬链接的文件大小是什么?什么都一样是吧?而软力的大小呢?是源文件的路径的。
32:01
动径的长度嘛,是吧,路径的长度啊。当然它如果是有汉字存在,比方说我们建一个带汉字的,他说这个,呃,马哥。Test,然后我们创建一个这个,然后再建一个新的文件,比方说叫F1LINK啊,你看一下。这个是十个字节。十个字节,那大家应该猜到这个一个汉字相当于几个字节,三个对吧,这六个六个再加四个是不是就十个。是吧,所以实际上它就是。占用的这个长这个路径,它占用的空间。啊,汉字要相当于占三个字节。好了,这是我们刚才给大家额外做总结啊,这个希望你们下来可以把这些。
33:04
好好的看一看。都能看懂吗?那个那我都讲过了啊。好。那这个下面呢,这就是以前生产案例和面试题啊。这个生产案例是这样的啊,这个不用说了吧,刚才讲过了。是吧?原因是什么?答案一句话。就是节点标号不够了吗?是不是节点标号用过。那第二个案例,第个第二个案例,这个是咱们以前有一个同学。上了班以后,他生产中遇到问题了,给我发了个截图,我给你留下来了。大家正好可以分析一下他说什么,他说空间满了。啊,使用RM呢,删了一个很大的没用的文件,结果发现仍然空间不足。
34:00
问,为什么?你看这个空间已经快满了96。96%了。这是它那个硬盘大小,它不大二10G,有人说,诶,那怎么这个硬盘这么小,还不如我笔记本大,别想着硬盘服务器上硬盘有多大,服务器上它有些用的是虚拟机。它虚拟机的空间没分那么大,但是一个物理机上跑了好多虚拟,就跟我们现在外面一样,所以它这个硬盘分的没那么大,因为生产中它这个业务有的时候不是存放大量数据的,所以不需要那么大。所以就是个很小的耳机,但是空间满了也不行啊,所以它这就提醒就出现了这样提示,那这个问题我们刚才也说过了,怎么解决呀。为什么?首先说说为什么,怎么解决,行了,我听不见你们说什么,你们给我打字吧,啊,赶紧打字,我看看你们打字的。
35:00
上来就杀进城啊,杀进杀谁呀?寻找大文件。你你咋咋到大文件。你先先说说具体的步骤啊。是不是可以,因为你不是刚才删了一个很大的无用文件吗?你先用那个l of用delete过滤一下,是不是找到那个删的文件,然后找到删的文件以后,你发现它是不是上面有一个进程在使用啊。然后你看看这个进程能不能关闭,如果能够关闭或者短期关闭最好了,比方说如果是一个生产中的业务服务。那么你不不方便现在马上关了它,那你可以找一个夜深人静的时候。比方说半夜两点钟,你是不是没什么人访问了,你偷摸的把这个进程给它关了,再重启一下,因为关了重启的话,可能也就短短几秒钟就起来了,或者是呃,一分钟用不了,这样的话受用用受影响的用户很少,不至于有人投诉你是吧?哎,所以这样的话呢,你就可以把它这个问题不就解决了吗?因为你程序关它那个进程占用的文件是不是也就释放了是吧?哎,原因就是这个道理。
36:16
啊,当然你可不能是这个这高峰期这么搞啊,高峰期这么搞容易,这算算在你身上的,这是是属于生产故障,生产事故。好了,这是刚才我们给大家讲的这两个案例。好,那接下来呢,咱们来学习又是一个非常重要的技术,叫重定向和管道技术。这个技术绝对是大家以后要经常用到的。那么所谓的重定向什么意思?重定向英文单词叫redirect。啊,重定向,重定向就是改变了方向。改变了你的定定位的方向。
37:01
大家来学运维,实际上就是一种重定向的思想,原来大家可能学上学的时候学的各行各业的,现在下定决心要学韵维了,这是不是就改变了你以前的?原来的方向,原来你的专业方向。哎,那你原来默认,比方说我原来是学这个文科的,那我就搞文科的工作不就得了,这是顺着默认的原始的这个路径来走就行了,那现在我们学运没了,这是一个比较大的改变。啊,这叫重定向。那在Linux中也需要重立一项技术。那么我们首先回顾一下,之前我们讲Linux的时候提到过一切接文件,对吧?一切接文件,所以在Linux中任何一个使用的资源最终都表现为文件存在。那么这个文件呢?在打开的时候,系统会自动的分配一个描述符,每一个文件被打开,系统会自动分配一个文件的描述符,我们简称FD。
38:10
FD就是文件描述符,就这个。啊,文件描述符是一个数字。1234的一个数字,那么其中这个数字中有几个是有固定含义的?其中前三个从零开始编号,012有固定含义。当然其他的那就是你打开一个文件,思路分配一个了,那为了让大家看的清楚我这儿呢,来做一个简单的操作,比方说。我们用TRTR这个命令呢,可以打开一个文件。比方说我们打开一个这个F2文件,这时候这个文件就打开了,这个文件正在被访问,那么在被访问的时候呢,系统就会自动的分配一个文件描述符。那么当然分配的描述符是什么?我们就得关注这个TR,这是个命令,它对应的内存空间,在它的内存空间中会记录下来TR命令打开的文件有哪些,它的文件描述是什么啊?那这个东西我们可以在这儿来看,有一个叫PC的目录,然后这里面呢,我们去用PID of here可以看到。
39:26
T命令对应的进程编号,然后在这有一个文件夹叫FD,就是它一个文件夹叫文件描述符,在这就看见了。看是不是一个三分配给了我们现在T命令打开的F2问题。看到没有,是不是就有一个三啊,这个三就是它的文件描述图,明白吧,但是这个文件描述是随机分的啊,就像那个我们创建一个文件系统,分配一个节点标号一样的随机分,分哪个算哪个,但是有前三个有固定含义。那前三个对应的是012,这三个有特殊功能,当然如果我把这个文件停了,比方说我把这个程序停了,那程序停了这个东西,文件描述符也就回收了。
40:11
明白了吧,哎,那么其中012这个东西是什么意思呢?是这样的012。它对应的。发现012就是个软件机。啊,指向到了DVPPS0,那这个PPS0是谁呢?实际上PS0就是我们这个终端的窗口的设备编号,那我们当前这个呢在哪,我们看一下我是PDS1,那隔壁那个不是PDS0吗。对不对啊,当然你要不确定,你敲库看一看不就知道了,现在我们是不是就是TTY1PDS0PDS1远程终端远程登录,你看这不就是pds吗。所以那个隔壁那个终端不就是PS0吗。啊,那这个DVPTS0对应的就是我们当前的设备的名称。那我们发现012实际上都指向的什么?
41:02
那都指向的是它,那到底啥意思呢?诶零代表着什么呢?代表着标准输入。标准输入。一代表着标准输出。二代表着标准错误。零标准输入呢,表示的就是。我们用户输入的信息,那我们在计算机里面怎么输入信息让计算机处理啊。我们最典型的是不是通过哎键盘啪一个出东西就行了。啊,当然这个也不一定是通过键盘输啊,那你复制粘贴不也行吗?比方说我们就复制这一段啪一贴不也行吗?对不这个鼠标,反正总之就是通过这个终端是不是把信息给输进去了。那也就是说我们用的这个终端实现了输入,所以它这零指向pds,零理解成了吧,零就是我们这个用的这个终端,哎,那EE代表着标准输出,输出就是有些命令呢,它有输出结果。这个输出结果呢,有正确的,有错的,标准输出指的是正确结果。
42:04
啊,正确结果,比方说我们LS这个并列是不是有执行结果呀,那么它在屏幕上打印出这些东西来,都算标准输出。啊,当然这个标准输出输到哪去了,那么就是你在哪,你在哪个终端就输到哪去呗,我在这个终端里面P台零,我就输出到P0,我在P点一,我是不是就输出P1啊。啊,当然我现在是在哪,那现在你也可以看一下,我现在为什么打印在当当前这个终端里面,那就是因为我们在这儿有一个Dollar Dollar fd,你看它对应的是不是PPS1啊。到了到这儿就是表示你当前这个用户的进程。啊,当前的进程,所以我们在这儿可以看到一啊,标准输入,标准输出都指向的是当前的终端,那事实上还有二二的话呢,就是错误了,因为我们执行命令有可能不会说哎都对,也可能会偶尔犯了错,是吧,比方说我敲错命令了,这个错误命令是不是也有一些输出的错误信息啊。
43:02
那或者呢,当然这种错可能是别的也可能啊,比方说我不存在的文件夹是不是也可能啊,或者呢,这个参数是不是有可能给敲错了呀,这是不是都是各种错呀,那这个各种错误信息,当然有的也不一定是错啊,也可能是提醒,也也可能是提示信息。那么这些信息他都认为是二,听懂吗?二就是标准,我们叫错误。啊,那对应的英文分别叫stdin。Std out std error。那这个当然是英文单词缩写了,SDD呢,实际上就是。哪个单词呀。啊,英语好的同学在这个呃,窗口里打一下我看看。啊,英语好的同学哪个单词啊。咱们咱们班里头有没有这个这个出国的同学啊。
44:04
41期有一个是是在哪儿呢?是悉尼是吧,悉尼咱班没有是吧。没人打出来呀,英语好的同学诶。这个是,呃。对,哎。到底哪个是对的呀?谁对呀,超对吧,超对了是吧,涛涛对了,嗯。啊,所以你看这是标准。当然呢,就是input。Out,那就out。ER,不就是吗?啊,错误。好,这就是咱们三个设备,这三个设备。都有默认的设备来完成。
45:01
他们的工作标准、输入标准、输出标准错误都是在当前的终端窗口来实现。当然,我们刚才说过重定向的概念。所以重定向呢,就是我不在我这儿来完成了,我能不能不用当前窗口啊,换个窗口行不行啊对吧?哎,这也是可以实现的,那么这个要想实现就得用重定向技术了。那么重定向我们在这儿可以看一下标准输出重定向。标准输入重定向,标准错误重定,也就是说我们不用当前终端窗口来干这些事儿了,咱们换一个位置来干,当然由于一切接文件,那就是拿文件呗,那当然文件呢,我们可以拿另外一个终端的设备文件名不也行吗?所以我们可以这么搞,怎么搞呢?就是我们先来实现第一个叫标准输出的重定向。也就意味着我把标准输出的结果给它重新到别处去。例如,我充电到。
46:03
我出现到这个地方来。啊,我这儿默认显示是当前我在的终端来负责显示的,我这边有一个。PTS1的终端,我现在就不想在当前这个PTS0上显示,我就想把这个结果呢输出到PTS1上去,那我们可以用标准输出重定一下,怎么做呢,大于号。大于号后面,实际上这个地方有一个一。我不过一般不写一刚才是什么意思啊,标准输出,所以我们一大于号后面跟上,你要重定向的新路径新文件,那新文件在哪啊,第1PT。S1,是不是我们这边不是一嘛,我们是在一设备里面对不对啊,那为了看得清楚,我们把把屏幕清干净一点,等待着这边的信息是吧,看看能不能有效果没有,那么走一走看看走,诶你看我这边自己不显示了吧,在我这不显示了,你看没有,原来是不是我在这显示,应该是没了,没了,那这指纹是A这出来了。
47:12
是不是实现了重定向啊,改变了方向啊,你的人生目标发生了变化是吧?从此走上了正确的路线啊,学运维还是有这个方向性不错的啊。当然,方向对了,不一定能取得,一定有结果。是吧,方向只是起步而已,还得进一步努力啊,那我们看到输出重定向用大于号就实现了,大于号可以实现标准输出的重定向,那同样道理,那标准错误要想重定向怎么办呢?那就是二大于号。不过因为标准输出重新项一大于号用的太多了,基本上用的最多,所以还有一个省略写法,就是大于号。所以大于号和一大于号是等价,既然等价何不再写个一呢?所以一般我们就不写一了,都是用大于号就行了,当然标准错误呢,这个得写,标准错误的话呢,写上二大于号,当然这个地方就说了,那啥叫标准错误啊,我们说了犯错误啊,比如说我随便敲一个命令是不是犯错了?
48:20
哎,那这个犯错了,他不是在当前窗口嘛,那我也给他重定向到别处去,比方说这个错不是我的错是吧,果断甩过到另一个窗口去,你的错了对吧?啊,这重对向了,那我们来看看这个能不能重对向成功啊,啊,这边我们也把屏幕刷干净一点啊,等待着这边错误的输出,看看怎么样走,哎,果然没有错了啊,错在哪了?你的错是不是?哎,不是他的错,好了吧,这标准输出重名项就成了。啊。当然,那这个错实际上说是错啊,不一定,有的时候长得不一定像错,比方说。
49:03
呀。这个这个这个不是别名了是吧。啊,这个不是别名的,那我退出来。好,那现在又是别名了。好,然后呢,我们去删一下文件,比如说F2,我这个删删的话呢,我不我这不加这个。你看他删的时候是不是有个报警,那这个报警信息到底是标准输出还算是标准错误。那如果我用F,我用大于号PPS,我看这边终端还是一是吧,这边还是那个一不是吗?好,那我把那一上重定向,那如果重定向成功,那说明它就算标准输出。
50:17
对吧,发现什么了,没充电过去。是不是还在当前窗口显示,那说明他肯定不是伊朗。那不是一的话,那是不是二呢?那我们来试试。二。没了吧?那错误信息提示说删文件是否删,诶在哪呢,在这。那接下来问你敲歪是吧,那敲歪你是在这敲啊,还是在这敲啊?在哪挑啊?在哪个窗口吧,左边右边窗口在哪敲,是PDS1还是PDS01在这敲,你在这敲起作用吗?你看这不搭理,你在这瞧。
51:12
在原来的地方敲,因为你重定向的是标准错误,并没有重定向标准输入,也没有重定向标准输出。理解了吗?它是三个不同的重定项哦。理解了吧,所以现在大家发现了啊,那这个错误说是错误也不一定真的,这这坏人有时候不是长得就那么坏嘛。那渣男长得很帅呢,对不对啊,所以我们说是标准错误,不一定是真的错,也可能只是个警报提示啊,是吧啊,所以希望大家明白啊,有的时候这个名字起的不一定能够哎,就忘文生义的话,容易产生错误一些啊。
52:00
好,那这是刚才说的标准错误的重定向,咱们现在就已经实现了,那无非就是看来是一大于号或者大于号,这是标准输出的纯定项,那么二大于号呢,就是标准错误的纯定项。那这个重定向将来带来的好处是什么呢?就是我们当然我们重定向另一个窗口里,这个意义不大啊,因为你不在这个窗口里,又跑到别的窗口里了,万一人家这个窗口就没有呢。我把这个窗口关了,那是不是就你只有一个窗口,你也别重新上别处去了,那就没什么用,所以我们大部部分情况下呢,我们这个重新下往往是重建一个文件里面去,比方说我就想把我们当前系统中的文件列表,我存到一个文件里去,那现在我们就有方法了,是不是我就可以用这样的方法随便写个文件名,这样的话是不是就把这文件名就重新上到文件里去了。这样的话,我们这个文件是不是就保存的就是刚才LS的执行结果。那用了这种方法以后要生成文件列表,是不是再也不用手工去复制粘贴了?是不是直接用重定向就可以生成一个存放文件列表的文件了?
53:09
那大家想,这就意味着是不是我们可以用这种手段可以批量生成数据了?那究其根本,不就是批量生成数据吗?生成数据之后,你想我用程序生成数据,再用程序来批量处理,代替人工,我们人工就解决了,解放了,是不是提高了工作效率呀?这就是计算机的强大能力所在,一切都程序把我们搞定。如果程序搞不定,那我们人工去一条敲,那那就没什么意义了。所以,这就是我们的背后的思想。好,那这是刚才我们已经实现了标准输出,当然大家可能发现那这个文件本身默认是不存在的,那换句话说,本身不存在,它就给你创建出来了,但是万一这个文件已经有了,那么如果有,我再执行一个命令,大家想这会产生什么问题?
54:03
Who,我们都知道who命令是显示什么结果,对吧,那现在我们原来的文件有内容,那你这样一整。咦,发现了吗?那旧的文件就没了覆盖了,所以这样的话呢,我们觉得,哎呀,我想不要覆盖呀,旧的东西能不能留下来呀,哎,可以留,那你用追加行为就行了,那么追加怎么追加呢?比方说我们大于号。两个大于号,这就是追加,那么大家再来看,你看是不是两个内容它留下来了,它不至于丢啊追加。这就是追加行为,当然我们刚才说的那个错误信息,那个二大于号,它也支持这种两个大于号也这样写啊,比方说我们现在啊,再再来一个错误啊,再来一个错误啊,比方说我们这写了一个根本不存在的文件夹,那这个也是算是一种错误,对吧,也算是一种错误啊,我刚才放到哪去了。
55:05
这个这个例子是刚才那个第一个随便写一个吧,假如说1.test。然后我们再来一个BB。啊。啊,这个多了个空格,空格啊,大家看这两个错误信息是不是就都进去了对吧?哎,这是注加两个大于号就属第加。好,那现在大家明白了,当然有的时候呢,我们在执行一些命令的时候,我们不希望在屏幕上显示信息。因为有的命令它执行的时候会故意的在屏幕上打印一些提示,而这些信息我不想让别人看到,比方说更改口令啊等等一些信息我不希望别人看到,那这时候我想把这个屏幕上显示的,无论是标准输出还是标准错误,都不想在屏幕上显示,那怎么办呀?
56:04
那我们可以这么来干,比方说。有一个这样的一个情况,我们执行命令的时候,有没有可能说里面有对的,也有错的,有标准输出也有标准错误,有没有可能,那比方说有可能会出现这样的情况,这是一个错误的文件夹没有,但是呢,我们这确实也有一个真实存在的文件夹。那这样的话,我们同时一执行,是不是又有对的有错的对吧?那这时候我们对的放在一个文件里,比方说对的放F1文件里,错的这个放二文件里。可以吧,这是不是就是分开放了,那这个分开放以后呢,我们看一下一文件就是对的,二文件就是错的。看到没?分开放,哎,分门别类,一个放文件放对的,二放错的啊。但是我分开放是不是也变相的起到了隐藏这个命令执行结果的效果?
57:05
那这个文件这个命令执行就屏幕上不显示了。啊,当然我能不能合二为一啊,管你对的错的能不能放一个文件里啊,啊,那方法也是有的,方法有的,那怎么写呢,就是这样写,就是at大于。啊,我这写个all吧,代表着所有你看这时候这个文件里面对的错的都放一起了。是吧,这就是大于号,当然这个大于号这种写法,这是第一种写法,那么我们换一个写法,换一个写法,换个二二,你看这个O2里面是不是也有对的,也有错的,所以大于号at也是可以的,它两个是等价的,听懂了吧,都可以把对的错的都放在一个文件,不过呢,记住一个就够了,我建议大家记这个吧。啊,因为这个写法说实在的,这这好多人都不用。啊用的也少,所以你用这个写法。
58:03
啊,当然两个写法是一样的啊,功能是一样的啊。上面舒服啊,你喜欢这个姿势是吧,啊那啊,你喜欢哪个你就用哪个嘛,对不对啊,这无所谓,谁在前谁在后无所谓,只要你舒服就好。好,那除了这种方法,实际上我们还可以用一个方法怎么做呢?这么做,这么做就是我们大于号。二大于号一。然后前面写个大于号。啊,后面跟上文件哦,比方说呃,我因为有一个三文件了。二文件了,我再来个三码。那这样写,这样写也是可以的。
59:02
这样写也行。大家看你看这个二三里面是不是有了。对的,错的。成了吗?成了吧,啊成了,所以这个方法也是可以的,但是这种方法怎么乘的,大家能看懂吗?我这个写法是啥个意思呀,我这个是。一大于号就是大于号就相当于一大于号嘛,对吧,那就是把对的往文件里写,那么二往这啥意思。那就是二往一里写,那二往一里写,一已经说了,往文件里写,二往一里写,那一也放文件里,那是不是二到一的都放文件里?啊,这就这个意思啊,那有人说,那我们反过来行不行啊,比方说我们换一个个。
60:00
我可以不可以这么写啊,这样写行不行啊。二往一里写,一往文件里写。这行不行?所以这个地方它之所以加二的符号,就是为了避免你把一认为是个文件名。啊,加上I的符号后面表示就是一这个表示文件描述符知道吧,哎,因为你要不写这个I的符号,它一不是小,它以为是个文件名呢,啊,所以就是加以区分啊,啊所以这样,哎这样做行不行呢?走一走。错误,怎么好像没充电成功?那正确的结果看来是进去了。是吧,错的,为什么进不去啊?那这个逻辑背后逻辑你能知道为什么吗?
61:02
哎,这个实际上命令不都是从左到右执行的吗?从左到右执行的时候二大于号二一,那是不是就是把错的往一里写,而在这的时候一是不是还在屏幕上打印呢?所以就打印了,结果到这的时候发现一往文件里写,那么这时候错的是不是已经来不及了,也在平面打出来,那这时候呢,把对的往文件里写,错的就在平幕打印。理解了吧?啊,当然,那我们反过来行不行呢?我们能不能这么干呢。这成不成?这行不行?真能达到把错的对都放一个文件里行不行?可以。
62:00
行不行,那就是我们这个这样写,就是把错的往文件里放,然后把一错往二里放,二就是错的。而错的是不是已经前面规定是往文件里放,那是不是也就意味着错的对的都放在文件里去了,看诶成了是吧,好了,那看看哦。成了吧,哎,所以大家发现没有,我们要想把错的对的放一个文件里,现在大家总结了是不是有多种方法。但是有个方法不行,在这个面试题里面就问到了,我这儿有一个面试题哦。面试题。多种方法。哪个。他不会告诉你,就先先把这个题先扔在这儿。啊,这问你。
63:02
哪个命令与众不同?哪个命令的执行结果和别人都不一样。你现在选吧,按照编号abcd选一选。谁与众不同?知道答案了吧,这面试题啊,面试题就出这种题,你要是不体系学习的话,估计这个就栽在这里,答案应该是最后一个吧。对吧。啊,第三个。好,我看大家都答到的很好啊,这个这个你们你们不说话的同学可以不说话,但是你至少得听课啊,这个不要走私啊,这个不说话我也不知道你们在想什么。
64:06
啊,思考人生吗?是吧,现在不需要思考人生啊,现在就学习就行了。好,那这是刚才我们给大家讲的这个命令的一个结果啊,那现在这个命令再来看,你就知道什么意思了吧,现在再来看这个命令是用它怎么清空大文件的,你现在明白意思了吗?我们用的实际上就是重定向。不过我刚才用过一种方法,就是大于号那种方法,不过大于号那种方法是不是它依赖于share啊,这种写法是不是它依赖于share啊?因为我们说了大于号属于share的独特性。而干share有这种写法,而sc share它不支持这种写法,但是你要用这个写法,大家都支持。前面不能为空,就是CSH,你直接写个空,不行,写上文件就可以了,那第一位那。
65:00
啊,清空大文件啊,所谓的清空大文件就是前面啥不写,那不就后面清空大文件空的嘛,要把这文件就清空了啊,所以但是这个闹设备本身也是空嘛,这个闹设备就是一个那垃圾桶黑洞一样的东西啊,就是你放什么,它就给你消失掉,给你吃掉空,对吧。好,这是咱们给大家介绍的。所以好多东西咱们学会了以后,你就知道它背后的逻辑了啊。呃,那么另外呢,我们也可以把多个文件。多个命令的执行结果,给它重定向到一个地方,那么方法就是。小括号括起来,中间分号隔开,或者用括号括起来也行,不过呢,每个地方都需要加分号。比方说我们这儿有这个命令,有这个命令,这两个命令都有执行结果。我们都希望把它们重定向到一个文件里,那如果我们这样写,你会发现它重定向的是是谁?
66:08
发现LS的执行结果没重新向成功,是不是只把那个CL的命令的执行结果重新上就去了啊,记了吧,啊,为什么?那你应该知道,因为他认为这是一条命令,认为这是一条完整的命令。理解了吧,所以这个它只自己解决的是这个cat命令的重新项啊,KCL的重新项,它没有解决这个,所以你要把这两个命令的重新,这个执行结果都重在文件里,那方法就是我们提高优先级,小时候学过四则运算,如果想提高优先级,来小括号呗,把它括起来作为一个整体不就得了。是不是这不就完事了吗?啊,那我们确认一下看成了吧,对吧,哎,就成了。当然我们也可以换画括号啊,大号写法也是可以的,不过画括号写的时候,最后这个地方别忘了加分号,这个地方别忘了加分号啊。
67:08
这个加分号要加分号啊,比如为了区分,我这来个F2,哎,你看是不是也行啊。啊,这个封号必须加啊,这个封号最后一个封号,要不加的话,你看他就认为命令没结束。明白吧,它就不执行了啊,当然这个这个分号前后有没有空格,这个实际上我们加上空格,加上空格是为了看起来是,哎,你看这个地方。这没有加空格,那我最后这个地方。加上个空格。前面给他加空格哦,这给他加空格,哎,前面的空格不加不行。前面那个画括号,后面的空格要加,不加的话呢,会有问题的啊,加入空格啊,最后那个空格可以不用加。
68:01
啊,这就是咱们这个重定向的标准输出标准错误的重定向。啊,所以我们以前有同学就是把这个。一些这个命令的执行结果用重对象存起来,存起来将来带来的好处就是我们可以把它生成一个新文件,将来把这个文件慢慢打开去研究。比方说有些命令的执行结果特别多。啊,那慢慢慢命令是不是特别多。那这个慢命令呢,比方说我们干一下,这是不是一大堆。对不对,这一大堆啊,哎,我能不能把这个重立项啊。但是。那这时候我们把这个但test打开,你看里面放的是什么,是不就是我们半帮助大的帮助。以前有同学就把这个文件这么打开,以后慢慢的去。
69:01
一行行去看。啊,并且把它翻译成中文。这是19期的一个同学。19期的是你们的大表哥的大表哥了啊。这个文件3000多行,翻译完了几个,大概几万字。啊。因为他一直想花一个完整的时间好好的把办事整个特性好好研究一下,因为办事里面包含了内部命令的所有用法,也包括了一些大于号啊,重立项,这些所有best的特性都在里面。所以这个同学趁着这个时间,正好也是个他专门辞职来的,他的工资也不低了啊,专门辞职过来学习,所以利用这个时间好好的沉淀沉淀,打打基础。自己翻译。所以同学们可以学习一下这些人的前辈们的是吧,学习经验啊。啊,这些都是我们将来用到的方法是这个。
70:04
那方法给你写在这儿吧。这就是用的重定项。但是实际上啊,目前来讲,这个实际上你可以不用去自己翻译了,网上有那个翻译好的。网上有翻译的BA的中文版,大家可以去下,因为我们目前用的share类型主要是BA。Be里的特性太多了,而且各种符号用法都在里面,所以大家如果想学好bash,最好看看bash的完整说明,有机会的话啊,不一定看完,但是你可以有,就算抽空看一看是吧?这是我们给大家讲的重定向的这个写法。这个hello。啊,这个写法我们后面再说吧,啊,这个是写了一个脚本里面的东西啊。这个也可以这样写。好,那我们给大家讲了标准输出的重定向。
71:05
像这个命令大家知道什么意思吗?这个命令我们先说一下前面的命令吧,这个命令是不是要提醒我们输口令了?也就是改这个用户的口令呗,啊,比方说我们输两遍口令,输两遍口令。改完了,但是有的时候我们希望改口径的时候,不希望让别人知道是不是我就可以把它。扔到垃圾箱里,那扔到垃圾箱里屏幕上是不是就不打印东西了?哎,所以我们这时候就是该口令,当然他不提示,那你就你就当没看见,反正也看不见是吧,那就敲呗,哎,比方说挑一个新口令。再敲一遍,因为敲两遍嘛。成了。知道吧,这些时候就改了口径。闷头敲呗,是不是起到了隐藏的信息的效果是吧?当然,这个信息就被隐藏了。好了,这就是标准输出标准错误的重定项,咱们下午呢,来实现标准输入的重定项。
72:07
啊,那咱们上午就上到这儿,咱们下午再见。
我来说两句