文章目录
作者信息
作者:黄钰朝
邮箱:kobe524348@gmail.com
日期:2019年7月8日
前言
这两天主要学习Linux的基本指令,了解Linux的发展历史,系统结构。
我之前有安装过Linux的虚拟机,在阿里云的Linux服务器上部署过一些jsp项目,只知道一些Linux的基础指令,比如切换目录,查看文件,编辑文件,修改一下权限这些,对于一些概念,其实没有了解过,只是看教程折腾多了,有个模糊的印象。这次是工作室的学习安排,花两天的时间去学习Linux的基础指令,其实两天的时间远远无法掌握Linux系统的知识体系,我主要从对Linux系统的简要介绍开始,分为文件管理系统,用户管理系统,权限管理系统,进程管理系统几大模块记录自己的学习心得,这几个模块,对于服务器开发来说,非常基础,掌握这几个方面的基本概念和基本指令,才能够比较正确有效地使用Linux系统进行开发,给后面做项目打下基础。在最后一部分,还简单记录了Shell脚本的内容,主要目的是学习管道符和管道命令。
本文的内容,比较有功利性,侧重于记录自己对重要的基础概念的理解和看法,略过一些冷门知识的细节,学习内容上也是根据工作室的安排,选取了对于服务器开发而言比较实用和重要的部分。在文章的末尾,我列出一些参考的资料,如果希望了解更多的细节,可以查看那些完整的教程。
一.Linux系统简介
1.1 Linux系统的历史
Linux和UNIX系统有着密切的联系,在计算机系统中,UNIX是老祖宗,Windows和Linux都是在模仿UNIX的基础上产生的,苹果的OS X也是基于UNIX的FreeBSD版本开发的,Linux也被称为“类UNIX系统”,Android和IOS也都是类UNIX系统,与UNIX系统相比,Linux的一大优点是开源免费,用户可以不受限制地修改和扩展Linux系统,并且具有UNIX系统全部的功能,与Windows系统相比,Linux系统更加节省硬件资源,适合于服务器开发。
PS:关于Linux和UNIX的发展史,着实是有趣,我也看了很久,但是这里主要写学习笔记和自己的感悟,因此不在这里赘述,墙裂建议有兴趣的人去看一下。
1.2 Linux系统的结构
Linux系统从硬件开始,分别是内核层,Shell层和应用层
- 内核层(kernel) :Linux系统的核心和基础,负责管理软件资源和硬件资源,提供稳定的运行环境
- Shell层:命令解释器,这是和用户直接交互的界面,由用户输入指令,快捷高效地执行功能
- 应用层:提供基于X Window协议的的图形环境,也就是符合一定规范,具备一定功能的图形操作界面
二.Linux的文件管理系统
2.1 Linux中的文件
在Linux系统中,一切皆文件,包括普通文件(比如文本文件)和目录文件(目录也是一个文件),甚至是硬件设备,也是文件。具体来说,主要分为以下几个类型:
-
普通文件
类似 mp4、pdf、html 这样,可直接拿来使用的文件都属于普通文件,Linux 用户根据访问权限的不同可以对这些文件进行查看、删除以及更改操作。 -
目录文件
对于用惯 Windows 系统的用户来说,目录是文件可能不太好理解。Linux 系统中,目录文件包含了此目录中各个文件的文件名以及指向这些文件的指针,打开目录等同于打开目录文件,只要你有权限,可以随意访问目录中的任何文件。
注意,目录文件的访问权限,同普通文件的执行权限,是一个意思。 -
字符设备文件和块设备文件
这些文件通常隐藏在 /dev/ 目录下,当进行设备读取或外设交互时才会被使用。例如,磁盘光驱属于块设备文件,串口设备则属于字符设备文件。Linux 系统中的所有设备,要么是块设备文件,要么是字符设备文件。 -
套接字文件(socket)
套接字文件一般隐藏在 /var/run/ 目录下,用于进程间的网络通信。 -
符号链接文件(symbolic link)
类似与 Windows 中的快捷方式,是指向另一文件的简介指针(也就是软链接)。 -
管道文件(pipe)
主要用于进程间通信。例如,使用 mkfifo 命令创建一个 FIFO 文件,与此同时,启用进程 A 从 FIFO文件读数据,启用进程 B 从 FIFO文件中写数据,随写随读。
2.2 Linux挂载
与Windows系统拥有C,D,E等众多盘符不同,Linux所有的文件路径都是以"/"作为起点,“/”表示Linux系统的根目录,这样就形成一套以根目录为根结点的树形目录系统,而在Linux看来,所有的硬件设备都是文件,每个设备都有自己的文件目录系统,因此,必须将设备的文件系统合并到Linux的文件目录系统中,才能进行访问和使用,这个合并的过程称为“挂载“。
挂载,也就是使设备的文件目录成为Linux文件目录系统的一部分,即将设备的根目录连接到Linux文件系统的某个文件夹上,这样,在访问这个文件夹时,也就等同于访问这个设备。
当把一个设备挂载到一个目录之后,这个目录原有的文件将会被隐藏,因此通常将设备挂载到一个空的文件夹上。
2.3 Linux文件路径
- 绝对路径:从”/"开始写起的完整的文件路径,比如/root/test/hello.html
- 相对路径:以当前路径为参照来写的文件路径,比如./test/hello.html
- 相对路径中使用到的符号:“.”表示当前目录,“…”表示上一级目录
2.4 与文件操作相关的指令
- cd <目录>:切换目录,后面可以是绝对和相对路径,也可以是一些特定的符号,比如cd ~ 表示切换到用户目录
- pwd :查看当前路径
- ls :查看当前目录下的文件
- mkdir:创建目录,也就是新建文件夹
- rmdir:删除空文件夹,如果文件夹中有文件,会报错
- touch:创建文件或修改文件的时间参数
- cp [参数] 源文件 目标文件:复制文件
- rm :删除文件
- mv:移动文件或重命名
三.Linux用户管理系统
3.1 用户和用户组
在使用Linux系统时,必须先登录一个账户,也就是一个用户身份,Linux是支持多用户多任务的系统,也就是在同一时间,可以有多个用户登录到同一个Linux系统上,执行不同的任务,互不影响。不同的用户拥有不同的权限,所能执行的任务也就不一样,为了方便给多个用户授予相同的权限,就产生了用户组的概念,一个用户组就是一组用户的集合,给一个用户组授权,就相当于给这一组用户同时授权,这样就大大简化了授权工作。
3.2 UID和GID
- UID :用户id,其中0是root用户,1-499是系统用户,500-65535是普通用户,用户名是一串便于记忆的字符串,实际上Linux系统需要通过/etc/passwd文件获取用户名和UID的一一对应关系
- GID: 组id,表示用户初始组的id
3.3 初始组和附加组
- 初始组:用户创建时所在的组
- 附加组:在初始组的基础上,还可以将用户添加到别的用户组中,这些组就是该用户的附加组,该用户可以拥有附加组的全部权限。
一个用户只能有一个初始组,可以在创建时指定,如果不指定,则会自动创建一个与新用户同名的用户组,作为该用户的初始组。而一个用户可以有多个附加组。
3.4 /etc/passed文件
这个文件中记录了系统中所有用户的基本信息,并且系统中所有用户都可以对这个文件进行读操作。
用户的基本信息共7项,使用“:”分隔开来,主要包括:
- 用户名:便于记忆的一个字符串
- 密码:当然,在这个文件中不会直接显示密码,而是全部使用”x"代替了密码
- UID
- GID
- 描述信息:相当于备注,说明这个用户的意义
- 主目录:每个用户都有一个文件夹作为自己的主目录,在命令提示符中使用“~”可以代表当前用户的主目录
- 默认Shell:也就是默认的命令解释器,通常Linux的默认命令解释器是bash
3.5 用户系统相关的指令
3.5.1 useradd指令
格式:useradd <用户名>
作用:添加新用户(不带任何参数时,创建的用户没有密码,可以带“-p <密码>" 来设置密码,但是密码必须是加密后的密文,也可以创建之后再使用”passwd <用户名>“来重置密码)
选项 | 含义 |
---|---|
-u UID | 手工指定用户的 UID,注意 UID 的范围(不要小于 500)。 |
-d 主目录 | 手工指定用户的主目录。主目录必须写绝对路径,而且如果需要手工指定主目录,则一定要注意权限; |
-c 用户说明 | 手工指定/etc/passwd文件中各用户信息中第 5 个字段的描述性内容,可随意配置; |
-g 组名 | 手工指定用户的初始组。一般以和用户名相同的组作为用户的初始组,在创建用户时会默认建立初始组。一旦手动指定,则系统将不会在创建此默认的初始组目录。 |
-G 组名 | 指定用户的附加组。我们把用户加入其他组,一般都使用附加组; |
-s shell | 手工指定用户的登录 Shell,默认是 /bin/bash; |
-e 曰期 | 指定用户的失效曰期,格式为 “YYYY-MM-DD”。也就是 /etc/shadow 文件的第八个字段; |
-o | 允许创建的用户的 UID 相同。例如,执行 “useradd -u 0 -o usertest” 命令建立用户 usertest,它的 UID 和 root 用户的 UID 相同,都是 0; |
-m | 建立用户时强制建立用户的家目录。在建立系统用户时,该选项是默认的; |
-r | 创建系统用户,也就是 UID 在 1~499 之间,供系统程序使用的用户。由于系统用户主要用于运行系统所需服务的权限配置,因此系统用户的创建默认不会创建主目录。 |
3.5.2 gpasswd指令
格式:gpasswd [选项] <组名>
作用:设置组管理员,修改组密码,添加组成员等,将一个用户添加到群组中最好使用gpasswd -a而不是usermod -G,因为usermod -G将一个用户加入一个群组,会把用户之前所在的群组清空,而gpasswd不会。
可选参数:
选项 | 功能 |
---|---|
选项为空时,表示给群组设置密码,仅 root 用户可用。 | |
-A user1,… | 将群组的控制权交给 user1,… 等用户管理,也就是说,设置 user1,… 等用户为群组的管理员,仅 root 用户可用。 |
-M user1,… 将 user1,… | 加入到此群组中,仅 root 用户可用。 |
-r | 移除群组的密码,仅 root 用户可用。 |
-R | 让群组的密码失效,仅 root 用户可用。 |
-a user | 将 user 用户加入到群组中。 |
-d user | 将 user 用户从群组中移除。 |
3.5.3 其他常用指令
- passwd <用户名>:设置密码,查询密码状态,锁定用户等等操作
- usermod <用户名>:修改已有用户的信息
- chage <用户名>:查看密码详细信息,修改密码的信息,和passwd不同的是,使用chage可以强制用户在第一次登陆系统后必须修改密码并重新登陆系统,才能正常使用
- userdel <用户名>:删除用户
- id <用户名>:列出用户的UID,GID和附加组
- su <用户名>:切换用户,除了从root用户切换都普通用户之外,需要验证用户密码
- groupadd <组名>:添加用户组
- groupmod -n <新组名> <旧组名>:修改组名,groupmod指令还可以修改组id
- groupdel <组名>:删除用户组
- newgrp <组名>:从用户的附加组中选择一个作为用户新的初始组(初始组只能有一个)
四.Linux权限管理系统
4.1 权限管理
当一个Linux被多个用户同时使用时,比如服务器上的Linux系统,如果所有用户都拥有完整的root权限,那么所有人都可以进行开关机,修改系统配置等等一些敏感操作,这样会给系统安全带来非常大的隐患,因此需要对权限进行管理,最好时遵循"最小权限原则“,即只分配用户所需的最小权限,尽量不要使用root用户,因为root用户的权限过大,一不小心误操作,也可能会造成不可恢复的后果。
4.2 文件权限位
前面提到过,Linux系统中”一切皆文件”,那么,对于权限的管控,主要就是给文件添加权限属性,一个文件的权限属性有三种,读权限(read),写权限(write),执行权限(execute)。添加文件属性时,还需要指定权限的对象,也就是谁拥有这个权限,比如文件所有者通常拥有全部的三种权限(读,写,执行),其他用户通常只拥有读权限。访问文件的对象也可以分为三种,所有者(owner),所有群组(group),其他用户(others)。
Linux系统使用"r"代表读权限,“w”代表写权限,“x”代表执行权限,"-“代表没有该项权限。比如"rwx"表示拥有三种权限,“r-x"表示只有读,执行权限,没有写权限。对三种对象设定三种权限,共3*3=9个位来描述Linux种文件的权限属性。
4.3 使用数字代表权限位
为了方便使用,Linux中使用数字来代替权限位,r,w,x分别使用以下数字代替:
- r :4
- w :2
- x :1
为什么使用这三个数字?根据我自己的猜测(因此并不权威),是因为三种权限的组合刚好有8种情况,分别是
- 全无 (0+0+0=0)
- 有一种权限 (只执行0+0+1=1,只写0+2+0=2,只读4+0+0=4)
- 有两种权限 (执行和写0+2+1=3,执行和读4+0+1=5,写和读4+2+0=6)
- 有三种权限(4+2+1=7)
以上刚好是8种情况,而0,1,2,4四个数字的和,刚好是从0-7总共8种不重复的情况。
前面说到,权限位总共有9位,分别是所有者3位,所有群组3位,其他用户3位,总共9位,使用上面的1,2,4三种数字代替三种权限并求和,共有8种结果,分别代表一个对象所可能拥有的权限的8种情况,用1,2,4三个数字的和代替一个对象的权限,那么一个文件的权限属性,总共就需要使用三个数字就可以描述出来。
比如:
所有者 = rwx = 4+2+1 = 7
所属组 = rw- = 4+2+0 = 6
其他人 = r-x = 4+0+1= 5
那么,这个文件的权限就是:765
4.4 权限管理相关的指令
- chown <用户名> <文件名> :修改所有者
- chgrp <组名> <文件名> :修改所有群组
- chmod <权限位数字> <文件名>:修改文件的权限属性,就是上面提到的三个数字代表的权限设定(这个命令也可以使用字母的方式进行修改)
4.5 ACL权限(访问控制权限)
在前面所讲的文件的权限属性中,将权限设定分为了三种对象,三种权限共9个权限位,看起来已经满足权限管理的需求,其实还不够,仔细来看,前面的权限设定方式,可以给所有者设定权限,可以给一组用户同时设定权限,可以给除了所有者和这一组用户的其他用户设定权限,但是我们还可能遇到一些特殊的情形,比如一个用户的不能是一个文件的所有者,他需要一些特殊的权限,这些权限不能让其他普通用户拥有,又不能让他和所有群组的用户具有同样大的权限,那么我们就无法通过上面的权限设定的方式给他赋予权限了。
当我们需要对某个特定用户赋予特定权限时,就需要用到ACL权限控制。
PS:关于开启ACL权限和设置ACL权限的内容,我看了一下,也试了一下,发现我的Linux系统还没开ACL权限,加上这个目前来说我还不常用,先跳过了。
4.6 mask(有效权限)
前面讲到ACl权限控制可以给某个用户授予特定权限,但是这是有条件的,ACL所能授予的最大权限就是mask。也就是说,ACL权限的上限是mask,不过我们一般不修改mask,设置为rwx就好。
4.7 umask(用来设定默认权限)
umask是用来设定在Linux中新建一个文件时默认已有的权限属性,直接使用umask指令可以查看这个默认设置,使用umask <权限>可以修改默认设置,比较特殊的是,umask的值是4位数字,这是因为第一位是代表特殊权限(SetUID、SetGID、Sticky BIT),这里先不研究,主要说明的是后面我们熟悉的三位数字的权限设定。
重点需要注意,为什么这里不说”umask是默认权限”,而是说“umask是用来设定默认权限的”?
因为这里umask后三位的值并不是默认权限的值,实际上:
默认权限 = mask权限 - umask权限
也就是说,默认权限其实是由最大权限和umask权限共同决定的,需要通过计算得出。(这里的减法是逻辑上的减法,不是数字上的减法,需要通过逻辑运算得到,这里不展开)
那么问题来了,为什么非要“共同决定”?
我们当然会觉得由两个权限计算得出默认权限,显得非常麻烦,不如直接设定默认权限的值来的方便,但是问题在于,如果我们设定的默认权限高于mask权限,也就是超过最大权限,显然是不行的,那么,这里所作的减法运算的作用,其实就是在mask权限范围内,去掉umask权限,最后得到的默认权限,就是mask中有,而umask中没有的那部分权限,因此,umask其实是一种缺省权限,也就是说,我们只需要指定默认没有的权限,除此之外,在最大权限范围内的权限,都可以有。可以看出,这样的默认权限设定方式,使得我们在设定umask权限时,不必担心默认权限会超出最大权限的范围,同时这种缺省的设置方式,也可以避免重复设置带来的冲突。
4.8 SetUID(SUID特殊权限)
除了前面提到的rwx三种权限之外,其实还有一个“s"权限。SUID 特殊权限仅适用于可执行文件,所具有的功能是,只要用户对设有 SUID 的文件有执行权限,那么当用户执行此文件时,会以文件所有者的身份去执行此文件,一旦文件执行结束,身份的切换也随之消失。
五.Linux的进程管理系统
5.1 什么是进程?
进程是正在执行的一串指令,程序只是一些指令,数据的集合,真正在运行的时候,是以进程的形式在计算机中被执行,一个程序通常会产生多个进程,可以由多个用户同时使用。每个进程都需要占用一定的系统资源,比如CPU资源,内存资源等等,操作系统会给每一个进程分配一个进程id(PID)。
有些进程在运行过程中会产生新进程,那么这个进程就作为父进程,新产生的进程作为子进程,子进程依赖于父进程,如果父进程不存在了,那么子进程也将消失。
进程管理的作用,就是通过查看系统中正在运行的进程,观察进程所占用的系统资源,来判断计算机的健康状况,阻止非法进程的运行,必要的时候通过杀死进程来维护计算机的正常运转。
5.2 查看进程状态
5.2.1 ps指令(常用的参数组合形式,其实还有很多)
- ps aux: 可以查看系统中所有的进程;
- ps -le :可以查看系统中所有的进程,而且还能看到进程的父进程的 PID 和进程优先级;
- ps -l :只能看到当前 Shell 产生的进程;
需要注意的是,上面的ps aux指令没有通常需要的“-”,这个指令可以用来查看某一时刻系统中进程的详细状态。输出的内容的含义见下表
参数 | 含义 |
---|---|
USER | 该进程是由哪个用户产生的。 |
PID | 进程的 ID |
%CPU | 该进程占用 CPU 资源的百分比,占用的百分比越高,进程越耗费资源。 |
%MEM | 该进程占用物理内存的百分比,占用的百分比越高,进程越耗费资源。 |
VSZ | 该进程占用虚拟内存的大小,单位为 KB。 |
RSS | 该进程占用实际物理内存的大小,单位为 KB。 |
TTY | 该进程是在哪个终端运行的。其中,tty1 ~ tty7 代表本地控制台终端(可以通过 Alt+F1 ~ F7 快捷键切换不同的终端),tty1~tty6 是本地的字符 |
STAT | 进程状态。常见的状态见后面 |
START | 该进程的启动时间。 |
TIME | 该进程占用 CPU 的运算时间,注意不是系统时间。 |
COMMAND | 产生此进程的命令名。 |
STAT中的几种状态的含义:
- R:该进程正在运行。
- S:该进程处于睡眠状态,可被唤醒。
- T:停止状态,可能是在后台暂停或进程处于除错状态。
- W:内存交互状态(从 2.6 内核开始无效)。
- X:死掉的进程(应该不会出现)。
- Z:僵尸进程。进程已经中止,但是部分程序还在内存当中。
- <:高优先级(以下状态在 BSD 格式中出现)。
- N:低优先级。
- L:被锁入内存。
- s:包含子进程。
- l:多线程(小写 L)。
- +:位于后台。|
5.2.2 top指令(动态地展示进程的信息)
和ps指令相比,这个指令可以持续跟踪进程状态的变化,默认情况下,每隔三秒会刷新进程信息,因此,这个指令的输出内容是动态的,更加接近于Windows中“任务管理器”的内容。
top指令有以下这些可选参数:
- -d 秒数:指定 top 命令每隔几秒更新。默认是 3 秒;
- -b:使用批处理模式输出。一般和"-n"选项合用,用于把 top 命令重定向到文件中;
- -n 次数:指定 top 命令执行的次数。一般和"-"选项合用;
- -p 进程PID:仅查看指定 ID 的进程;
- -s:使 top 命令在安全模式中运行,避免在交互模式中出现错误;
- -u 用户名:只监听某个用户的进程;
5.2.3 pstree指令(查看进程树)
pstree指令用来查看进程树,输出的是程序和进程之间的关系
pstree指令有以下这些可选参数:
- -a 显示启动每个进程对应的完整指令,包括启动进程的路径、参数等。
- -c 不使用精简法显示进程信息,即显示的进程中包含子进程和父进程。
- -n 根据进程 PID 号来排序输出,默认是以程序名排序输出的。
- -p 显示进程的 PID。
- -u 显示进程对应的用户名称
5.2.4 lsof指令(列出进程打开的文件)
lsof指令可以查看进程中打开了哪些文件,也可以从文件找到调用的进程。
lsof指令有以下这些可选参数:
- -c 字符串 只列出以字符串开头的进程打开的文件。
- +d 目录名 列出某个目录中所有被进程调用的文件。
- -u 用户名 只列出某个用户的进程打开的文件。
- -p pid 列出某个 PID 进程打开的文件。
比较特殊的是列出某个目录中被进程调用的文件,不是“-d",而是”+d"
5.3 改变进程优先级
5.3.1 Linux进程优先级
在 Linux 系统中,表示进程优先级的有两个参数:Priority 和 Nice
其中,PRI 代表 Priority,NI 代表 Nice。这两个值都表示优先级,数值越小代表该进程越优先被 CPU 处理。不过,PRI值是由内核动态调整的,用户不能直接修改。所以我们只能通过修改 NI 值来影响 PRI 值,间接地调整进程优先级。
PRI (最终值) = PRI (原始值) + NI
总而言之,我们只能通过改变NI值来影响进程的优先级,并且NI值越小,进程的优先级越高。
修改 NI 值时有几个注意事项:
- NI 范围是 -20~19。
- 普通用户调整 NI 值的范围是 0~19,而且只能调整自己的进程。
- 普通用户只能调高 NI 值,而不能降低。如原本 NI 值为 0,则只能调整为大于 0。
- 只有 root 用户才能设定进程 NI 值为负值,而且可以调整任何用户的进程。
可以看出,PRI值越小,优先级越高,而普通用户调整的NI值只能是正值,那么调整后的PRI值只会比原来大,那么优先级只能比原来低。
5.3.2 nice命令
nice命令主要用于在启动时设定进程的NI值,无法设定已经启动的进程的NI值。
使用方式:
- nice [-n NI值] 指令
5.3.3 renice命令
renice命令主要用于设定正在运行的进程的NI值。
使用方式:
- renice <NI值> PID
需要注意的是,renice和nice不同,renice是用于修改已经运行的进程,所以第二个参数是PID而不是指令。
5.4 杀死进程
5.4.1 kill指令
kill指令是用来杀死进程的,但是其实kill指令并不直接杀死进程,而是向系统内核发送一个信号,并且指明目标进程的id(PID),由系统内核来执行相应的操作,kill指令可以发送不同的信号,分别指定了不同的操作方式。具体信号类型见下面表格:
5.4.2 killall指令
killall和kill指令的作用大致相同,只是用于终止一类进程(相同进程名的进程)。
使用方式如下:
- killall [选项] [信号] 进程名
5.4.3 pkill指令
pkill指令用于管理进程时用法和killall相同。
pkill的一个重要作用是踢出登陆的用户。
踢出用户时,使用方式如下:
- pkill [-t 终端号] 进程名
六.Shell脚本
6.1 什么是Shell?
前面介绍Linux系统结构时提到,Shell层是Linux系统的一部分:
Shell层:命令解释器,这是和用户直接交互的界面,由用户输入指令,快捷高效地执行功能
确切地说,Shell 是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序的界面系统级程序,用户可以用 Shell来启动、挂起、停止甚至编写一些程序。
6.2 echo指令
echo指令是一个输出指令。相当于在屏幕中打印指定的内容,还可以用来输出变量的值。
PS:此处跳过一些Bash相关的知识。
6.3 grep指令
grep 的作用是在文件中提取和匹配符合条件的字符串行
使用格式:
- grep [选项] “搜索内容” 文件名
可选参数:
- -A 数字:列出符合条件的行,并列出后续的 n 行;
- -B 数字:列出符合条件的行,并列出前面的 n 行;
- -c:统计找到的符合条件的字符串的次数;
- -i:忽略大小写;
- -n:输出行号;
- -v:反向査找;
- –color=auto:搜索出的关键字用颜色显示;
6.4 bash管道符
在 Bash中,管道符使用"丨"代表。管道符的作用是连接多条命令,如"命令1丨命令2"。。不过和多命令顺序执行不同的是,用管道符连接的命令,命令 1的正确输出作为命令 2 的操作对象。这里需要注意,命令 1 必须有正确输出,而命令 2 必须可以处理命令 1 的输出结果;而且命令 2 只能处理命令 1 的正确输出,而不能处理错误输出。
总而言之,管道符的作用,是让上一条执行命令的结果,作为参数提供给下一条命令。
6.5 管道命令(pipe)
管道命令就是以管道符为分割的组合命令。
七.总结
经过两天的学习,相比之前只会几个常用的指令,对Linux系统的了解更加全面和深刻了,尤其是Linux中一切皆文件,Linux对于用户的管理,Linux对于权限的控制和管理,还有Linux的进程管理这些方面的概念的理解,非常实用。
后面学习的管道符,我现在还没能体会到它的好处所在,因为对于文件的操作,我通常还只是查看和修改,而且使用Xftp的图形界面比较多,命令行操作还比较少。
Linux系统的知识还远远不止这些,想要真正掌握,还是要在后面的学习中多多实践,这两天学习的还是很基础也很片面的知识,我也期待将来再重新全面地学习Linux。
八.参考资料
- 鸟哥的Linux私房菜:比较通俗有趣,但是我觉得废话有点多
- C语言中文网-Linux教程:比较详细,解释挺清楚
- 菜鸟教程-Linux教程:比较简洁