Linux第一课:Linux的基本命令和底层结构的理解

Linux第一课:Linux的基本命令和底层结构的理解 引言今天我们也是正式进入到Linux的学习想必大家对Linux这个名字都不陌生Linux是一套开源、免费、多用户和多任务的类Unix操作系统内核也是所有程序员必学的系统今天我们就先来了解一下Linux的一些基本命令和原理。接下来的讲解我用的是Ubuntu系统。一、目录目录是Linux系统的核心骨架整个系统所有资源全部挂载在目录树下目录就相当于是windows系统的文件夹所以要打好Linux的基础我们第一步要做的就是先了解Linux目录的相关知识。我们今天要学的基础命令有ls、pwd、cd、mkdir、rmdir、rm、touch、stat、tree、alias、man、cp、mv、echo、cat、which、more、less、head、tail、date、grep、zip、unzip、tar1、pwdpwd这个命令的用法很简单就是显示当前所处的路径。如下所示“/home/ubuntu”就是我们当前所处的路径。此时显示的这个路径最右边的是我们当前所处的位置在它前面用一个斜杠‘/’进行分割的就是它的上级目录‘/’在Linux中是路径分隔符这时候就出现了一个问题最前面那个斜杠是什么它前面也没有目录名称了它的作用是什么呢这个斜杠在Linux中表示的是整个系统的根目录的意思系统里的所有目录和文件都是包含在‘/’这个根目录下的子目录。Linux的文件结构时一颗从根目录/开始的一个多叉树叶子节点一定是普通文件或者空目录非叶子节点一定是一个非空目录。2、lsls的功能是显示当前路径下的文件它一般有三种常见的不同写法你既可以直接写成ls也可以写成 ll 或 ls -l 其中 ‘-l’是命令行选项命令行选项可以是零个也可以是多个多个选项既可以用空格隔开也可以直接连在一起写。那么它们三个有什么区别呢“ls”是只显示当前目录下文件的名称“ls -l”的功能是列出文件名称的同时还会显示文件的属性。“ll”则是在“ls -l”的基础上将隐藏文件夹也显示。这是个重点知识文件并不单单只有内容而是由内容属性共同构成的。学习文件要么对内容操作要么对属性操作lsls -l我们可以很明显的看出它们的区别。其中文件属性最前面的单词首字母代表该文件的文件类型d则代表它是一个目录文件- 则代表它是一个普通文件后面那串数字就表示它的文件大小文件大小后就是它的最后修改时间。ls还有一个常见的命令行选项‘-a’上面三个命令都只能显示普通的文件而-a的功能就是可以列出所有的文件包括被隐藏的文件在Linux中文件名前面有‘.’的文件是隐藏文件。可以看到加上-a后上面就出现了三个以‘.’开头的文件它们就是隐藏文件其中有两个名字很奇怪的隐藏文件‘.’ 和 ‘..’这个我们后面会专门进行讲解。ls -a大家应该能很明显的看出来“ll”的功能似乎就是“ls -l” 和“ls -a”的结合体这是为什么就像C一样在Linux中你也可以给命令起别名而ll就是ls -l -a的别名在Linux中使用alias命令就可以给其他命令起别名具体写法是“alias 别名 ‘命令’ ”。这个别名只是个临时别名一旦你退出当前机器别名就会消失。直接输入alias可以看到当前机器的所有别名3、treetree和ls类似也是用于显示当前路径下的文件tree在用的时候要在后面加上文件名tree与ls不同的地方在于ls是以一个表的形式来展开tree则是以树形结构展开文件里所有的文件和目录结构。如下所示。有些系统在刚下载时可能并没有自带tree命令这时候可以输入sudo apt install tree就可以将tree配置到系统中。4、mkdir/rmdir/rm/touch这四个命令都是用于目录/文件的创建和删除所以我们一起讲。mkdir是创建一个新目录但是只能创造一个那如果有人就想连续创建一串目录怎么办呢这时候就可以用到一个命令行选项-p mkdir -p 一串路径就可以一次创建一串路径。rmdir的功能是删除目录但需要注意的是它只能删除空目录不能删除非空目录如果想要将一个非空目录里所有的东西都删除就需要使用rmrm本身的功能是用来删除普通文件的但是如果它加上命令行选项-r就可以递归地删除整个目录内的所有内容rmdirrm -r最后一个touch则是用来创建一个普通文件没什么好说的。5、cdcd这个命令的用途是用来更改工作目录简单来说就是进入目录的意思最常见的用法就是直接在cd后面加上文件名。如果你想要进入的文件并不在当前目录下而是在子目录下就得在cd后面加上路径来进入。假设我现在想进入c目录可以看到我们就进入了c目录里面。cd还有两种特殊的用法cd ~就是进入当前用户自己的家目录家目录的意思就是任何一个Linux用户用特定用户名登录系统时默认就在家目录下比如说我当前的家目录就是ubuntu。cd -可以进入最近所处的路径是一个很方便的功能比如我刚刚所处的文件是根目录/此时我输入cd -就会从ubuntu进入/再输入一次又会从/进入ubuntu。接下来我们将在这里隆重介绍之前提到的‘.’和‘..’两个隐藏文件因为和cd以及tree命令结合起来比较好理解我们就放在这里进行讲解。所有目录里都有这两个隐藏文件它们都是目录其中‘.’代表的是当前目录‘..’代表的是上级目录任何一个目录即使是空的系统也要默认给该目录自动生成这两个文件我们来结合cd和tree来演示一下。从以上例子我们可以很明显的看出来这两个目录的作用cd ..我们就进入了上级目录tree .就列出了当前文件的树形图。据此我们可以拓展一个知识关于Linux系统里面的路径显示Linux系统里有两种显示路径的方式一种叫绝对路径一种叫相对路径。绝对路径指的就是以根目录为参照路径定位一个文件一般在文件配置中使用的比较多相对路劲就是以非/为参照位置定位一个文件一般日常操作用得多pwd显示的当前所处路径就是绝对路径。绝对路径举个例子我先进根目录然后再cd绝对路径进入ubuntu如上所示。然后我在ubuntu里再多创建两个文件进入project1再cd ../project2这行命令意思就是以上级目录为参照位置定位project2文件这就是Linux路径表示方式中的绝对路径和相对路径。相对路径6、stat之前我们知道了ls -l和ll在显示当前目录中的文件时会显示文件的部分属性stat这个命令可以显示文件更详细的属性。可以看到出现了更详细的文件属性其中比较显眼的是这份属性里有四个时间分别是Access、Modify、Change和Birth为什么会有四个时间呢它们又分别代表什么。Access表示文件的最后访问时间Modify表示文件内容被修改的时间Change表示文件属性被修改的时间Birth表示文件诞生的时间。那么为什么需要记录这么多份的时间呢因为有的时候我们不仅仅想要获取文件中的内容我们也想监控文件的状态比如什么时候被访问了什么时候被修改了什么时候创建的。所以这四个时间是文件的重要属性之一。7、manman命令是一个对新手很友好的命令当你有一个命令你不清楚它的功能是什么时你可以输入man 命令这样可以打开Linux中内置的命令手册并查找手册中对应的命令里面就会把该命令的所有用法都列出来假设我现在不懂ls怎么用或者是想知道它的其他命令行选项就出现了下面这个界面在这里就可以看到它的各种用法然后按q就可以退出如果你不知道具体要查什么命令只想打开命令手册可以直接输入man man就可以打开命令手册。8、cpcp拷贝命令将一个文件内的内容拷贝给其它文件。同样cp无法直接拷贝目录得写成cp -r递归拷贝目录才行当你的拷贝地点不存在时系统会自动创建一个跟你给的目标文件名字一样的文件或目录。如果拷贝地点也是个目录就会将起始位置的目录拷贝到目标目录内部。9、mvmv主要是用来移动文件或者将文件改名假设我现在创建了一个普通文件test我想将它移动到project目录中。如果想给文件改名的话也是直接在原文件名后面写上新名字就行了那么系统如何辨别用户到底是要改名还是剪切呢如果后面跟的名字是已有的目录名的话系统就会认定为是剪切如果后面跟的名字不是已有的目录名就认定为给文件改名10、echo在进入接下来这几个命令的讲解之前我们需要先来讲解一些Linux的基本知识。首先我们要明确一个概念在Linux系统中一切皆文件。这句话的意思就是在Linux系统里我们所看到的画面我们所打的各种命令等Linux系统将它们都看作是文件甚至连键盘还有两种显示器都是文件分别对应stdin、stdout和stderr这三个文件。所有输入输出操作在本质上就是文件操作。这两个显示器有什么区别我们以后再说这篇文章不需要理解。这三个文件是在启动程序时系统就自动帮我们打开了为了了方便用户在默认情况下就能直接输入和直接显示方便操作。接下来开始讲解命令echo这个命令很简单它的作用就是将它后面跟着的内容看作字符串并将字符串写入文件中。根据我们对echo命令的学习我将引入一个拓展操作来证明我上文引入的概念这个操作的名字叫做重定向操作。我们看上面echo命令的执行结果好像和我讲的有一点出入它直接就在终端显示出来了此时如果我将这个输出操作重定向一下。输出重定项的符号就是 ‘’ 可以看到我给echo加上输出重定向后这回并没有直接在终端中显示而是将其写入了test文件内通过这个例子就能很明显的看出来我们现在看到的终端界面实际上也就是一个文件在我们没有进行重定向时echo默认就是写入终端文件中。终端的文件名称是 /dev/pts/xxx 。这个0就是我当前所处的终端那么我们能不能做到往其他终端内写入呢毕竟本质都只是文件我们来新打开一个终端看看。可以看到当我们新打开一个终端时出现了一个新文件‘1’这个‘1’就是我们打开的新终端。我们现在试试往里面写入。可以看到我们也是成功往1号终端中输出了字符串。关于终端也是文件的概念我们已经讲完了关于重定向操作我们还有一些需要补充的内容。我们多运行几次输出重定向就会发现每一次重定向都会将文件清空然后才往里面写入。此外如果我们要写入的文件不存在它会怎么做呢根据演示我们可以总结出输出重定向的两个特点1、如果后续文件不存在就新建一个2、先清空文件再写入。那如果我不想它每次都清空文件我想接着写入怎么办这时候只要多打一个 ‘’就会变成追加重定向在原先的文本后面接着输入。11、cat在上面对echo指令的学习中大家其实也应该看出来cat的作用是什么了就是将文件内的文本打印到显示器。但此外cat这个命令还有一些知识我们需要学习。首先cat如果后面不接文件名的话就默认直接从键盘文件里读取内容再写到显示器文件可以看到我们先输入aa再点击回车就自动帮我们打印一行aa如果想要退出的话只要点ctrl c就行了。此外cat也是可以进行重定向的在cat后加上 ‘’再加文件名就是输入重定向了虽然它们两个的结果看上去是相同的但它们的内部逻辑其实不一样不加重定向符时是cat自己打开文件进行打印加上重定向符时则是shell也就是命令行解释器打开文件再通过stdin交给cat。shell的具体概念我们之后再来进行讲解。12、which在上面对echo和cat的学习中我们已经了解了在Linux系统内一切皆文件也证明了终端实际上也是文件。显然命令肯定也是文件命令的本质其实就是一个个在Linux系统中封装好的可执行文件其实也就等价于我们平常写的C/C程序。which这个命令的功能就是查找命令的可执行程序所在的路径。我们可以看到其实ls就是在bin目录里的一个可执行文件我们平常用的所有命令都是被存在这个目录里的。13、more/less当我们想打印大量内容时很容易出现一个屏幕打不下的情况要如果我想看的是最上面几行的文本就得往上划很长时间很不方便。而more的作用就是在打印过多的内容时它默认只打满一屏幕的内容按回车可以进行逐行下翻。假设我现在在test里输入了大量内容然后用more打印。但是要注意的是more只能进行下翻而不能进行上翻翻过了就是翻过了。而less的功能与more几乎完全一样但是less不仅能上翻还能进行下翻而且只用滑动鼠标滚轮就可以进行上翻下翻所以一般只推荐用less不推荐用more。如果想退出的话按q就行了。14、head/tailhead和tail这两个命令一个的功能是只打印开头n行的内容tail是只打印结尾n行的内容具体用法如下所示这样就显示出了前三行和后三行的内容那如果我想看中间几行的内容呢假设我现在想看第500到第510行的内容我们可以使用 ‘ | ’这个符号来进行对命令的级联‘ | ’是管道符号它相当于直接将前段命令的输出结果stdout当成输入stdin传给后段就比如说下面这个例子。之前我们的tail是读取test文件的后十行现在变成head先读取test文件的前510行然后将其传给tailtail再从这510行里读取后十行。15、datedate相信很多人看名字就能猜出来这就是一个用于打印时间的命令注意大小写一定要打对中间的分隔符没有要求怎么写都可以。如果单独只打date %s的话打印的是格林威治时间戳。16、grepgrep这个命令可以看作是一个行文本过滤工具可以帮用户把包含某些关键字的行筛选出来就拿刚刚的test文件举例我想检索所有含有‘99’的行。除此之外grep还有几个比较好用的选项 -n可以将筛选对象的行号一起打印出来 -v可以反向筛选将匹配成功的去掉匹配失败的留下 -i可以忽略大小写。17、zip/unzip/tar在讲解这几个命令之前我先来介绍一下打包和压缩的区别打包是将文件合并主要目的是防止文件丢失压缩则是将多个文件压缩为一个文件减少体积节省存储空间可以有效减少网络传送的时间。zip和unzip这两个命令分别是压缩和解压文件不过这个命令Ubuntu系统是不自带的需要自己输入sudo apt install zip unzip来下载。可以看到在输入命令后目录中成功出现了test的压缩包。需要注意的是zip只能压缩你给的文件本身也就是说如果你想压缩的是一个非空目录的话目录中的其他文件是不会被一起压缩的。如果想整个目录一起压缩的话就要写成zip -r递归地将整个目录压缩。解压的话直接使用unzip 压缩包名就可以直接原地解压。如图所示test.zip直接在ord目录里原地解压那如果想解压到其他文件怎么办也有办法假设我现在想将它解压回家目录先将家目录里的test删掉方便观察。可以看到只要在文件名后加上-d再加上目标目录名就可以解压到对应目录内。还有一个重要的知识点Linux和Windows系统的压缩包是可以互传的只要使用sz/rz就可以进行互传。在输入sz 加压缩包名后就会自动唤起这个选择文件夹的窗口就可以将该压缩包传到任何文件夹内了。同理输入rz就可以直接唤出窗口选择要传进来的压缩包。压缩包不仅可以支持Linux和Windows之间的互传也支持Linux和Linux之间的互传具体写法是scp xxx.tgz 用户名公网IP传输路径由于我没有两个服务器我就不做演示了zip和unzip对应的压缩和解压讲完了接下来的是tar也就是打包与zip不同的是tar命令不用进行递归因为它本身就具备打包功能可以直接帮用户将整个目录内的所有内容打包后再进行压缩。压缩解压tar还有一个和zip不同的地方是当你想将其解压到其他目录下时不再是使用-d而是使用 -C。二、shell命令行解释器/外壳程序我们在Linux系统中输入命令时命令并不是直接传递给Linux系统内核进行执行的而是要先经过外壳程序shell。那么为什么要有这一层外壳程序呢首先我们平常输入的这些命令其实Linux系统的内核是无法理解的我们输入的命令先进入外壳程序外壳程序将它们转化成内核能够理解的语句再将它们传给内核内核根据语句执行完后将执行结果传给外壳程序外壳程序将执行结果转化为具体的文字给用户看。所以外壳程序的第一个用处就是方便用户进行操作。我们上面所讲的各种重定向操作管道等都是通过外壳程序来实现的。其次如果用户在输入命令时输入了很多错误的命令甚至是很严重的错误命令外壳程序会将这些错误命令退回保证这些错误命令不会影响到Linux的内核。所以外壳程序的第二个作用就是保护内核。Ubuntu中的外壳程序叫做bash当我们输入错误指令时有时候就可以看到以bash开头的报错。总结今天我们学习了Linux系统中的各种常见指令了解了外壳程序的定义和功能。其实本节课学习的重点并不在于这些基础的命令因为在我们后面漫长的学习中这些都是最基础的重要的是我们要通过对这些基础命令的学习了解Linux的底层结构和运行原理这些才是我们这节课需要进行掌握的。