Linux系统命令与Shell编程

第1章 linux简介

1.linux系统主要特点

  • 免费开源。Linux是一款完全免费的操作系统,任何人都可以从网络上下载到它的源代码,并可以根据自己的需求进行定制化的开发,而且没有版权限制。
  • 模块化程度高。Linux的内核设计分成进程管理、内存管理、进程间通信、虚拟文件系统、网络这5部分,其采用的模块机制使得用户可以根据实际需要,在内核中插入或移走模块,这使得内核可以被高度的剪裁定制,以方便在不同的场景下使用。
  • 广泛的硬件支持。得益于其免费开源的特点,有大批程序员不断地向Linux社区提供代码,使得Linux有着异常丰富的设备驱动资源,对主流硬件的支持极好,而且几乎能运行在所有流行的处理器上。
  • 安全稳定。Linux采取了很多安全技术措施,包括读写权限控制、带保护的子系统、审计跟踪、核心授权等,这为网络环境中的用户提供了安全保障。
  • 多用户多任务。多用户是指系统资源可以同时被不同的用户使用,每个用户对自己的资源有特定的权限,互不影响。多任务是现代化计算机的主要特点,指计算机能同时运行多个程序,使之平等地访问处理器。由于CPU处理速度极快,从用户的角度来看所有的进程好像在并行运行。
  • 良好的移植性。Linux中95%以上的代码都是用C语言编写的,由于C语言是一种机器无关的高级语言,是可移植的。

2.系统启动流程

从按下计算机的电源键开始。首先,计算机会加载BIOS,这是计算机上最接近硬件的软件,各家主板制造商都会开发适合自己主板的BIOS,而BIOS中一项很重要的功能就是对自身的硬件做一次健康检查,只要硬件没问题,才能运行软件。这种通电后开始的自检过程被称为“加电自检”,如果所有的硬件自检通过,一般都会发出一次“滴”的短声提示,说明硬件一切正常。

第二步,机器自检通过后,下面就要引导系统了。这个动作是BIOS设定的,BIOS默认会从硬盘上的第0柱面、第0磁道、第一个扇区中读取被称为MBR的东西,即主引导记录。RedHat、CentOS默认会使用Grub作为其引导操作系统的程序,而Grub本身又比较大,所以常见的方式是在MBR中写入Grub的地址,这样系统实际会载入Grub作为操作系统的引导程序。

第三步,运行Grub。Grub最重要的功能是根据其配置文件加载Kernel镜像,并运行内核加载后的第一个程序/sbin/init,这个程序会根据/etc/inittab来进行初始化的工作。其实这里最重要的就是根据文件中设定的值来确定系统将会运行的run level,默认的run level定义在“id:3:initdefault:”中,其中的数字3说明目前的运行级别定义为3。

第四步,Linux将根据/etc/inittab中定义的系统初始化配置si::sysinit:/etc/rc.d/rc.sysinit执行/etc/rc.sysinit脚本,该脚本将会设置系统变量、网络配置,并启动swap、设定/proc、加载用户自定义模块、加载内核设置等。

第五步是根据第三步读到的run level值来启动对应的服务,如果值为3,就会运行/etc/rc3.d/下的所有脚本,如果值为5,就会运行/etc/rc5.d/下的所有脚本。

第六步将运行/etc/rc.local,第七步会生成中断或X Window来等待用户登录。

Linux中规定了以下9个man文件的种类:常用命令的说明、可调用的系统、函数库、设备文件、文件格式、游戏说明、杂项、系统管理员可用的命令、与内核相关的说明。

有些命令会在好几个种类中存在,可以使用man -f来查询要找的命令存在于哪些man文件中。

在这里插入图片描述

第2章 linux用户管理

1.用户和用户组

用来区分不同用户的数字被称为User ID,简称UID。系统会自动记录“用户名”和UID的对应关系。Linux系统中的用户分为3类,即普通用户、根用户、系统用户。普通用户是指所有使用Linux系统的真实用户,这类用户可以使用用户名及密码登录系统。Linux有着极为详细的权限设置,所以一般来说普通用户只能在其家目录、系统临时目录或其他经过授权的目录中操作,以及操作属于该用户的文件。通常普通用户的UID大于500,因为在添加普通用户时,系统默认用户ID从500开始编号。

根用户也就是root用户,它的ID是0,也被称为超级用户,root账户拥有对系统的完全控制权:可以修改、删除任何文件,运行任何命令。

系统用户是指系统运行时必须有的用户,但并不是指真实的使用者。比如在RedHat或CentOS下运行网站服务时,需要使用系统用户apache来运行httpd进程,而运行MySQL数据库服务时,需要使用系统用户mysql来裕兴mysqld进程。在RedHat或CentOS下,系统用户的ID范围时1~499。

在Linux系统中除了有用户之外,还有“用户组”的概念,不同的用户组同样也是用数字来区分的,这种用于区分不同用户组的ID被称为Group ID,也就是GID。

命令id:查看自己的UID

命令groups:查看自己所属的用户组

查询当前在线用户,可在用户登录以后,使用命令who看到目前登录在系统中的所有用户。

在登录Linux时必须要输入用户名和密码。而系统用来记录用户名、密码最重要的两个文件就是/etc/passwd和/etc/shadow

将密码相关的信息保存在/etc/shadow中,而且默认只有rootyoghurt才有读的权限,其他人完全没有读取这个文件的可能。

2.账号管理

增加用户:useradd

比如,需要新建一个叫john的用户,直接输入命令useradd john。对于系统来说,完成这个命令需要在后台执行很多对用户来说毫无感知的行为。首先,系统需要将用户信息记录在/etc/passwd中,一般会在/etc/passwd和/etc/shadow末尾追加一条记录,同时会分配给该用户一个UID。接着,要为该用户自动创建家目录。然后,复制/etc/skel下所有的文件至/home/john。最后,新建一个与该用户名一样的用户组,也就是说当创建用户john的时候,也同时创建了一个叫john的用户组,而用户john默认属于john用户组。

修改用户: usermod

有时候可能会由于某些具体的场景,需要对已存在的用户进行修改,这时候就需要使用usermod命令了。

删除用户:userdel

增加用户组:groupadd group1

在Linux中,使用/etc/group文件来记录用户组

删除用户组:groupdel group1

注:如果已有用户属于这个试图删除的组,该操作会失败。

检查用户信息:

(1)查看用户:users、who、w

使用命令users可以查看当前系统有哪些用户。实际上,Linux会把所有来自不同终端的活动定义为一个会话,从who命令输出,可以看出winda用户是通过不同的终端登录到系统中的。

在这里插入图片描述

命令显示的结果有三列,第一列是登录用户的用户名,第二列是用户登录的终端,第三列是用户登录的时间。如果是通过远程网络登录,则同时会显示远程主机的主机名或IP地址。

还可以使用w命令看到更详细的信息。

切换用户:有两种切换用户的方法:su和sudo

在这里插入图片描述

su - :加上这个参数后,切换成root用户时,不但身份变成了root,而且还能应用root的用户环境。

在这里插入图片描述

在这里插入图片描述
使用su命令虽然很方便,但还是有很明显的缺陷,就是切换成其他用户的前提是需要知道对方的密码。如果需要切换成root,那就要root的密码。

为了解决这个问题,可以使用sudo命令。

用其他用户的身份执行命令:sudo

严格来说,sudo并不是真的切换了用户,而是使用其他用户的身份和权限执行了命令。

3.例行任务管理

日常生活中常会有很多例行性的事情,比如说每周工作日的闹钟,每年一次的生日提醒等。还有一些事情是偶发性的,比如突然需要处理一封紧急的邮件等。在Linux中也有处理这两种任务的方法。如果任务是周期性执行的,其命令为cron;如果只是在某一个特定的时间执行一次,其命令为at。

单一时刻执行一次任务:at

从现在开始,设置30分钟后自动关机:

在这里插入图片描述
在这里插入图片描述

周期性执行任务:cron

有一些任务是需要周期性执行的,比如说每天早晨的闹钟会在设定的时间准时响起。在Linux中,可以利用cron工具做这种设置。首先需要确定crond进程在运行,如果没有运行,需要先启动该进程。

启动进程:service crond start

进入编辑模型: crontab -e

查看设置的任务:crontab -l

删除所有的任务:crontab -r

root用户可以使用-u 参数查看指定用户的任务:crontab -u john -l

第3章 Linux文件管理

1.文件目录结构

FHS(文件系统层次标准)定义了在根目录下的主要目录以及每个目录应该存放什么文件。

目录目录的用途
/bin常用的用户指令
/boot内核和启动文件
/dev设备文件
/etc系统和服务的配置文件
/home系统默认的普通用户的家目录
/lib系统函数库目录
/lost+foundext3文件系统需要的目录,用于磁盘检查
/mnt系统加载文件系统时常用的挂载点
/opt第三方软件安装目录
/proc虚拟文件系统
/rootroot用户的家目录
/sbin存放系统管理命令
/tmp临时文件的存放目录
/usr存放与用户直接相关的文件和目录
/media系统用来挂载光驱等临时文件系统的挂载点

当前目录:pwd

2.文件的相关操作

(1)创建文件:touch

(2)删除文件:rm

(3)移动或重命名文件:mv 第一个参数是要被移动的文件,第二个参数是移动到的目录。

除了能移动文件,该命令还能重命名文件。

mv test.doc /tmp/test.txt

需要注意的是,Linux下的目录也是一种“文件”,所以mv命令同样也适用于对目录的操作。

(4)查看文件:cat

该命令是concatenate的简写,用户查看文件内容,后面跟上要查看的文件名即可。

在这里插入图片描述

加上-n 参数,可以显示每行的行号

(5)查看文件头:head

在这里插入图片描述
-n参数指定显示的行数

(6)查看文件尾:tail

-f参数:可以动态地查看文件尾

3.目录的相关操作

目录的租用在于存放其他的目录和文件

(1)切换目录:cd

(2)创建目录:mkdir

(3)删除目录:rmdir和rm

(4)文件和目录的复制:cp

(5)文件时间戳:通过touch可以创建新文件,如果文件已经存在,那么touch命令仅仅会更新文件的创建时间,而不会修改文件内容,即时间戳会更新。

4.文件和目录的权限

(1)查看文件或目录的权限:ls -al

(2)改变文件权限:chmod

(3)改变文件的拥有者:chown

(4)改变文件的拥有组:chgrp

(5)查看文件类型:file

5.查找文件

(1)一般查找:find

命令用法:find PATH -name FILENAME

例如需要在系统中查找一个名为httpd.conf的文件:find / -name httpd.conf

可以使用通配符来模糊匹配要查找的文件名:比如想找出系统中所有以.conf结尾的文件,或以httpd开头的文件:

find / -name *.conf

find / -name httpd*

(2)数据库查找:locate

与find不同,locate命令依赖于一个数据库文件,Linux系统每天会检索一个系统中的所有文件,然后将检索到的文件记录到数据库中。在运行locate命令的时候可直接到数据库中查找记录并打印到屏幕上。在执行这个命令之前一般需要执行updatedb命名。

在这里插入图片描述
locate命令依赖于用于记录文件的数据库,该数据库需要使用updatedb来更新。

(3)查找执行文件:which/whereis

which用于从系统的PATH变量所定义的目录中查找可执行文件的绝对路径。

whereis也能查到其路径,但是和which不同的是,它不但能找出其二进制文件,还能找出相关的man文件。

6.文件压缩和打包

(1)gzip/gunzip

gzip/gunzip是用来压缩和解压缩单个文件的工具。

(2)tar: tar不但可以打包文件,还可以将整个目录中的全部文件整合成一个包,整合包的同时还能使用gzip的功能进行压缩。

在这里插入图片描述
tar -zxvf boot.tgz -C /tmp

(3)使用bzip2

使用bzip2压缩文件时,默认会产生以.bz2扩展名结尾的文件,使用-z参数进行压缩,使用-d参数进行解压缩。

在这里插入图片描述

第4章 Linux文件系统

文件系统是操作系统用于明确磁盘或分区上相关文件的方法和数据结构, 通俗的说法就是在磁盘上组织文件的方法。 在使用前, 都需要针对磁盘做初始化操作, 并将记录的数据结构写到磁盘上, 这种操作就是建立文件系统, 在有些操作系统中称之为格式化。

虽然文件系统多种多样, 但是大部分Linux系统都具有类似的通用结构, 包括超级块(superblock) 、i节点(inode)、数据块(datablock) 、目录块(directory block)等

超级块包括文件系统的总体信息, 是文件系统的核心, 所以在磁盘中会有多个超级块, 以防止由于磁盘出现坏块导致全部文件系统无法使用。 i节点存储所有与文件有关的元数据, 也就是文件所有者、 权限等属性数据以及指向的数据块, 但是不包括文件名和文件内容。 数据块是真实存放文件数据的部分, 一个数据块默认情况下是4KB。 目录块包括文件名和文件在目录中的位置, 并包括文件的i节点信息。

(1)磁盘分区、创建文件系统、挂载

磁盘使用前需要对其进行分割, 这种动作被形象地称为分区。 磁盘的分区分为两类, 即主分区和扩展分区 。在完成磁盘分区后, 需要进行创建文件系统的操作, 最后将该分区挂载到系统中的某个挂载点才可以使用 。

(2)创建文件系统:fdisk

(3)磁盘挂载:mount mount DEVICE MONT_POINT

mkdir newDisk

mount /dev/sdb1 newDisk

(4)设置启动自动挂载:/etc/fstab

(5)磁盘检验:fsck、badblocks

当磁盘出现逻辑错误时,可以使用fsck来尝试修复。fsck在检查磁盘的时候, 需要磁盘是未挂载的状态, 否则会造成文件系统损坏。 对于已挂载的设备需要先进行umount(解除挂载) 操作, umount命令的参数可以是设备路径或者是挂载点 。

(6)硬链接和软链接

硬链接(hard link)又称实际链接,是指通过索引节点来进行连接。在Linux文件系统中,所有的文件都会有一个编号,称为inode,多个文件名指向同一个索引节点是被允许的,这种链接就是硬链接。

硬链接的作用是允许一个文件拥有多个有效路径名, 这样用户就可以建立硬链接指向同一文件, 删除一个链接并不会影响索引节点本身和其他的链接, 只有当最后一个链接被删除时, 文件的数据块及目录的链接才会被释放。 也就是说, 文件真正删除的前提条件是与之相关的所有硬链接均被删除 。

硬链接的两个限制:

  • 不允许给目录创建硬链接
  • 只有同一个文件系统中的文件之间才能创建链接,即不同分区上的两个文件之间不能够建立硬链接。

创建硬链接:

在这里插入图片描述
在这里插入图片描述

软链接(Soft link)又称符号链接(Symbolic link)是一个包含了另一个文件路径名的文件,可以指向任意文件或目录,也可以跨不同的文件系统。软链接和Windows下的“快捷方式”十分类似,删除软链接并不会删除其所指向的源文件, 如果删除了源文件则软链接会出现“断链”。

在这里插入图片描述

创建软链接需要使用-s参数。 另外还请注意, 在创建软链接的前后分别使用ls-li命令, 会发现软链接的inode和源文件的inode不一样, 这说明软链接本身就是一个文件。

第5章 字符处理

1.管道

在Linux中,管道是一个固定大小的缓冲区,该缓冲区的大小为1页,即4K字节。管道是一种使用非常频繁的通信机制, 我们可以用管道符“|”来连接进程, 由管道连接起来的进程可以自动运行, 如同有一个数据流一样, 所以管道表现为输入输出重定向的一种方法, 它可以把一个命令的输出内容当作下一个命令的输入内容, 两个命令之间只需要使用管道符连接即可 。

2.使用grep搜索文本

grep是Linux下非常强大的基于行的文本搜索工具,使用该工具时,如果匹配到相关信息就会打印出符合条件的所有行。

用法:grep [-ivnc]

-i:不区分大小写 -c: 统计包含匹配的行数 -n: 输出行号 -v: 反向匹配

cat hello.txt | grep -vi ‘word’

3.sort排序

用法:sort [-ntkr]

-n:采取数字排序 -t:指定分割符 -k:指定第几列 -r: 反向排序

4.uniq删除重复内容

如果文件(或标准输出) 中有多行完全相同的内容, 我们很自然希望能删除重复的行, 同时还可以统计出完全相同的行出现的总次数, uniq命令就能帮助解决这个问题。

用法:uniq [-ic]

-i:忽略大小写 -c:计算重复行数

uniq一般都需要和sort命令一起使用,也就是先将文件使用sort进行排序(这样重复的内容就能显示在连续的几行中),然后再使用uniq删除掉重复的内容(uniq的作用就在于删除连续的完全一致的行)

cat uniq.txt | uniq cat uniq.txt | sort | uniq cat uniq.txt | sort | uniq -c

第6章 网络管理

1.网络接口配置

使用ifconfig检查和配置网卡

如果不使用任何参数, 输入ifconfig命令时将会输出当前系统中所有处于活动状态的网络接口 。如果在ifconfig命令后面跟上具体设备的名称,则只显示指定设备的相关信息。

由于某种原因如果希望手工指定eth0的IP地址,那么可按如下方式进行修改 :
在这里插入图片描述

有时候需要手工断开/启用网卡, 以eth0为例,使用方法如下:
在这里插入图片描述
将IP配置信息写入配置文件:

RedHat和CentOS系统的网络配置文件所处的目录为/etc/sysconfig/network-scripts/, eth0的配置文件为ifcfg-eth0, 如果有第二块物理网卡, 则配置文件为ifcfg-eth1, 以此类推。
在这里插入图片描述

2.路由和网关设置

route命令添加默认网关:route add default gw 192.168.100.2

删除网关:route del default gw 192.168.100.2

添加网关后, 可以使用route–n查看系统当前的路由表: route -n

同样的, 如果只使用route命令添加网关, 一旦系统重启, 配置信息就不存在了, 必须将这种配置信息写到相关的配置文件中才能永久保存。 可以在网卡配置文件中使用GATEWAY变量来定义网关,只需要添加如下部分到ifcfg-eth0中即可, 当然别忘了重启网络服务使配置生效 。

3.DNS客户端配置

/etc/hosts hosts文件作用主要如下:

  • 加快域名解析
  • 方便小型局域网用户使用的内部设备

设置主机为DNS客户端的配置文件就是/etc/resolv.conf, 其中包含nameserver、search、 domain这3个关键字

4.网络测试工具

host命令是用来查询DNS记录的,如果使用域名作为host的参数,命令返回该域名的IP。

在这里插入图片描述

traceroute是一个检测数据包是如何经由路由器的工具

我们可以想象一下该工具的工作原理: 它先构造出一个TTL值为1的数据包发送给目的主机, 这个数据包在经由第一个路由器时, 路由器先将TTL值减1变为0,然后将该IP包丢弃, 同时给发送一个ICMP消息,这样就得到了经过的第一台路由器的IP地址; 然后再构造出一个TTL值为2的数据包, 以此类推, 就能得到该IP包经历的整条链路的路由器IP。

5.防火墙常用命令

CentOS7:

查看防火墙状态:

sudo systemctl status firewalld

关闭防火墙:

sudo systemctl stop firewalld

打开防火墙:

sudo systemctl start firewalld

上面打开和关闭防火墙都是临时的,重启电脑后又会恢复到默认的状态。重启后查看防火墙状态,还是处于打开的状态

关闭防火墙开机自启动:

sudo systemctl disable firewalld

sudo systemctl enable firewalld

查看防火墙规则:

firewall-cmd --list-all

查询、开放、关闭端口:

查询端口是否开放

firewall-cmd --query-port=8080/tcp

开放80端口

firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=8080-8085/tcp

移除端口

firewall-cmd --permanent --remove-port=8080/tcp
查看防火墙的开放的端口
firewall-cmd --permanent --list-ports
#重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload

(1)firewalld相关命令

#进程与状态相关
systemctl start firewalld.service      #启动防火墙 
systemctl stop firewalld.service       #停止防火墙 
systemctl status firewalld             #查看防火墙状态
systemctl enable firewalld             #设置防火墙随系统启动
systemctl disable firewalld            #禁止防火墙随系统启动
firewall-cmd --state                   #查看防火墙状态 
firewall-cmd --reload                  #更新防火墙规则  
firewall-cmd --list-ports              #查看所有打开的端口 
firewall-cmd --list-services           #查看所有允许的服务 
firewall-cmd --get-services            #获取所有支持的服务 
#区域相关
firewall-cmd --list-all-zones           #查看所有区域信息 
firewall-cmd --get-active-zones         #查看活动区域信息 
firewall-cmd --set-default-zone=public  #设置public为默认区域 
firewall-cmd --get-default-zone         #查看默认区域信息 
#接口相关
firewall-cmd --zone=public --add-interface=eth0        #将接口eth0加入区域public
firewall-cmd --zone=public --remove-interface=eth0     #从区域public中删除接口eth0 
firewall-cmd --zone=default --change-interface=eth0   #修改接口eth0所属区域为default 
firewall-cmd --get-zone-of-interface=eth0  #查看接口eth0所属区域 
#端口控制
firewall-cmd --query-port=8080/tcp      # 查询端口是否开放
firewall-cmd --add-port=8080/tcp --permanent     #永久添加8080端口例外(全局)
firewall-cmd --remove-port=8800/tcp --permanent          #永久删除8080端口例外(全局)
firewall-cmd --add-port=65001-65010/tcp --permanent      #永久增加65001-65010例外(全局) 
firewall-cmd  --zone=public --add-port=8080/tcp --permanent            #永久添加8080端口例外(区域public)
firewall-cmd  --zone=public --remove-port=8080/tcp --permanent         #永久删除8080端口例外(区域public)
firewall-cmd  --zone=public --add-port=65001-65010/tcp --permanent     #永久增加65001-65010例外(区域public)

(2)常用命令

# 最常用命令
firewalld-cmd --zone=public --add-ports=8080/tcp --parmanent
命令解析:
firwall-cmd:是Linux提供的操作firewall的一个工具(服务)命令
--zone #作用域
--add-port=8080/tcp #添加端口,格式为:端口/通讯协议 ;add表示添加,remove则对应移除
--permanent #永久生效,没有此参数重启后失效

第7章 进程管理

目标:如何控制进程, 包括查看、 启动、 关闭、设置优先级等

1.进程的观察

ps: 查看进程,了解当前进程的情况

ps输出的只是当前查询状态下进程瞬间的状态信息,如果要想及时动态地查看进程,用top命令。top命令提供了实时的系统状态监控,可以按照CPU使用、内存使用、执行时间等指标对进程进行排序。

默认情况下top显示的进程是按照CPU使用率来进行排序的 。

在这里插入图片描述

2.进程的终止

要终止一个进程, 需要通过kill、 killall等命令来实现 。般来说, kill命令需要和ps命令联合使用。 原因是kill后面跟的应该是需要被终止的进程的PID 。

ps -ef | grep firebox

kill pid

查看进程打开的文件:lsof (list open files)

lsof是列出当前系统中所有打开文件的工具

3.进程优先级调整

nice renice

普通用户可以给自己的进程设定nice优先级, 但是范围只限于0~19 。 Linux使用了“动态优先级”的调度算法来确定每一个进程的优先级, 一个进程的最终优先级=优先级+nice优先级。

nice命令仅限于在启动一个进程的时候同时赋予其nice优先级

对于已经启动的进程, 可以用renice命令进行修改, 不过, 这需要先查询出该进程的PID(使用ps命令)

第8章 Linux下的软件安装

1.源码包编译安装

事实上, 有很多开源软件自身是不包含Makefile的, 特别是在模块化程度较高的软件中, 都不包含Makefile, 而需要用户根据具体的需求使用软件包目录中的configure工具, 生成适合用户特定需求的Makefile, 所以典型的源码编译安装软件的过程包括以下3步:
第一步, 运行configure命令, 并结合必要的参数以生成Makefile;
第二步, 运行make命令生成各类模块和主程序;
第三步, 运行make install命令将必要的文件复制到安装目录中。

2.RPM安装软件

RPM是RedHat Package Manager简写,是RedHat软件包管理器。

# 使用RPM包管理的方式是通过rpm命令
# -i: --install安装软件 -v: 打印详细信息 -e:删除软件  -U: 升级软件
# PACKAGE_NAME代表某个包的名字, VERSION代表版本 
(1)安装软件包  rpm -ivh PACKAGE_NAME-VERSION.rpm  
(2)测试安装软件包,不做真实的安装  
rpm -ivh --test PACKAGE_NAME-VERSION.rpm  
(3)安装软件包, 并重新定义安装路径  
rpm -ivh --relocate /=/usr/local/PACKAGE_NAME PACKAGE_NAME-VERSION.rpm
(4)强行安装软件包, 忽略依赖关系
rpm -ivh PACKAGE_NAME-VERSION.rpm --force --nodeps
(5)升级软件包
rpm -Uvh PACKAGE_NAME-VERSION.rpm
(6)强行升级软件包, 忽略依赖关系
rpm -Uvh PACKAGE_NAME-VERSION.rpm --force --nodeps
(7)删除软件包, 并忽略依赖关系。
rpm -e PACKAGE_NAME --nodeps #只是包名, 不需要跟版本号
(8)查询某个包是否已经安装
rpm -q PACKAGE_NAME
(9)查询系统中所有已安装的包
rpm -qa
(10)查询某个文件属于哪个包
rpm -qf /etc/auto.misc
(11)查询某个已安装软件所包含的所有文件
rpm -ql PACKAGE_NAME
(12)查询某个包的依赖关系
rpm -qpR PACKAGE_NAME-VERSION.rpm
(13)查询某个包的信息
rpm -qpi PACKAGE_NAME-VERSION.rpm
(14)删除软件包
rpm -e PACKAGE_NAME

3.yum安装软件

yum:Yellow dog Updater, Modified,是一个基于RPM的shell前端包管理器,能够从指定的服务器上(一个或多个)自动下载并安装或更新软件、删除软件。其最大的好处是可以自动解决依赖关系。RedHat和CentOS的版本为5以上的都会默认安装yum, 所以该命令可以直接使用 。

yum命令基本用法:

yum [options] [command] [package]
1.安装操作
yum install PACKAGE              #安装某个包
#  例: yum install httpd
yum groupinstall GROUP           #安装某个软件组
#  例: yum groupinstall "KDE"   #安装KDE桌面

2.升级操作
yum update                       #更新系统中所有需要更新的包
yum update PACKAGE               #更新某个包
# 例: yum update httpd
yum groupupdate GROUP            #更新某个软件组
# 例: yum groupupdate "KDE"     #升级KDE桌面
yum check-update                #检查当前系统中需要更新的包
3.查找操作
yum list                    # 显示软件源中所有可用的包, 一般不用
yum list installed          # 显示系统中已经安装过的包
yum info PACKAGE            #显示某个包的信息
# 例: yum info httpd
yum groupinfo GROUP         #显示某个软件组的信息
例: yum groupinfo "KDE"     #显示KDE桌面软件的信息
yum grouplist               #显示软件源宏所有的可用软件组
4.删除操作
yum remove PACKAGE             #删除某个包
# 例: yum remove httpd         #删除httpd包
yum groupremove GROUP          # 删除某个软件组
# 例: yum groupremove "KDE"    #删除KDE桌面
5.清除操作
yum clean                      #清除使用yum所生成的缓存文件

第9章 vi/vim编辑器

1.利用vim搜索关键字:

(1)使用vim打开/etc/ssh/sshd_config文件

(2)使用“/”符号查找关键字HostKey

搜索到的关键字是以当前的光标为相对位置、 往下找到的第一个关键字 。如果在搜索前( 也就是在一般模式的时候) , 光标是停留在第一行的, 那么搜索到的HostKey将是文本中第一次出现HostKey的地方。 也就是搜索功能默认使用光标位置下移来实现搜索操作。

找到了第一个HostKey后, 可以按n键继续往下找, 每按一次光标将跳至下一个关键字处, 如果要想往上寻找, 则按大写字母N 。

查找关键字还可以使用“?”符号, 和“/”不同的是, 使用“? ”查找默认是从光标位置向上寻找关键字, 按n键代表继续往上寻找, 按N键代表向下寻找。

2.替换关键字

有时候需要将整篇文档中的某个词换成另外一个词, 如果靠手工寻找替换是不现实的。 利用末行指令模式则可以轻易实现这个功能 。

3.使用vimtutor深入学习vim

4.gedit编辑器

第10章正则表达式

1.文本处理工具sed

sed(stream editor) 是一种非交互式的流编辑器, 通过多种转换修改流经它的文本。 但是请注意, 默认情况下, sed并不会改变原文件本身, 而只是对流经sed命令的文本进行修改, 并将修改后的结果打印到标准输出中(也就是屏幕) 。 所以本节讲的所有的sed操作都只是对“流”的操作, 并不会改变原文件。

2.文本处理工具awk

上一节中介绍的sed其实是以行为单位的文本处理工具,而awk是基于列的文本处理工具,它的工作方式是按行读取文本并视为一条记录, 每条记录以字段分割成若干字段, 然后输出各字段的值。

第11章 Shell编程概述

1.Shell简介

Shell是指一种命令行解释器, 是为用户和操作系统之间通信提供的一种接口。它接收来自用户输入的命令,并将其转换为一系列的系统调用送到内核执行,并将结果输出给用户。

Shell在OS中的位置:

在这里插入图片描述
Shell分为两大类,一类是图形界面Shell(Graphical User Interface),用户可以在GNOME桌面空白处点击鼠标右键,在弹出的菜单点击open Terminal选项,打开Shell。另一类是命令行式Shell(Command Line Interface),即CLI。

命令行模式下的终端:
在这里插入图片描述
事实上, Shell不只是一种解释器(在用户和系统间起着桥梁的作用),还是一种编程工具, 称为脚本语言。与编译型语言(比如C/C++/Java等) 不同, 脚本语言又被称作解释型语言,这种语言经过编写后不需要做任何编译就可以运行。

目前RedHat和CentOS发行版中默认安装了多种Shell, 可以使用如下命令来确认系统中可用的Shell是什么版本:
在这里插入图片描述

实际上, Bash是Bourne Again Shell的简称, 不过, 它在兼容Bourne Shell的同时又加入了很多新功能, 并从其他Shell中借用了不少好的功能,可以说是众多Shell的集大成者。

查看Bash Shell版本:bash --version

Shell的功能:

当一台系统运行起来时, 内核(kernel) 会被调入内存中运行, 由内核执行所有底层的工作, 它会将所有应用程序及用户的操作翻译成CPU的基本指令, 并将其送至处理器。 这些过程听起来非常复杂, 而且实际上也确实是非常底层和技术化的。 为了对用户屏蔽这些复杂的技术细节, 同时也是为了保护内核不会因用户直接操作而受到损害, 有必要在内核之上创建一个层, 该层就是一个“壳”, 也就是Shell名称的由来。

Bash Shell有两种工作模式, 分别是互动模式和脚本模式。 所谓互动模式就是由系统管理人员直接通过键盘输入命令, 并等待其执行完毕后再执行下一条命令; 而另一种模式是设计出一个脚本文件,将所有需要执行的命令写在该文件中, 由BashShell读取并执行。

很明显, 后一种工作模式的效率更高, 因为可以让工作变得“自动化”, 这也是我们学习Shell最重要的原因——将一切工作都自动化处理。

2.第一个Shell脚本

在这里插入图片描述

一个Shell脚本永远是以“#!”开头的, 这是一个脚本开始的标记, 它是在告诉系统执行这个文件需要使用某个解释器, 后面的/bin/bash就是指明了解释器的具体位置。

运行脚本:bash HelloWorld.sh

有几种方式来运行上面的HelloWorld.sh, 第一种就是在该脚本所在的目录中直接bash这个脚本。实际上, 如果使用这种方式来运行脚本, 该脚本中的第一行“#!/bin/bash”就可以不需要了, 因为直接bash一个文件就是指定了使用Bash Shell来解释脚本内容。

第二种方式是给该脚本加上可执行权限, 然后使用“./”来运行, 它代表运行的是当前目录下的HelloWorld.sh脚本, 如果采用这种方式而脚本没有可执行权限则会报错 。

在这里插入图片描述

如果希望该脚本能成为默认的系统命令, 简单地将该脚本复制到任一系统$PATH变量所包含的目录中, 同时赋予可执行权限, 下次运行的时候只需
要直接输入该命令即可。
在这里插入图片描述

3.Shell的内建命令

所谓Shell内建命令, 就是由Bash自身提供的命令, 而不是文件系统中的某个可执行文件 。

如何确定内建命令:type
在这里插入图片描述
别名:alias

alias可用于创建命令的别名, 若直接输入该命令且不带任何参数, 则列出当前用户使用了别名的命令。

使用alias可以自定义别名,删除别名:unalias 该命令用于删除当前Shell环境中的别名

任务前后台切换: bg、 fg、 jobs

声明变量: declare、 typeset

打印字符: echo

将所跟的参数作为Shell的输入, 并执行产生的命令: eval

执行命令来取代当前的Shell: exec

退出Shell: exit 在当前Shell中直接运行该命令的后果是退出本次登录。 在Shell脚本中使用exit代表退出当前脚本。

使变量能被子Shell识别: export

发送信号给指定PID或进程: kill

Linux操作系统包括3种不同类型的进程, 第一种是交互进程, 这是由一个Shell启动的进程, 既可以在前台运行, 也可以在后台运行; 第二种是批处理进程, 与终端没有联系, 是一个进程序列; 第三种是监控进程, 也称系统守护进程, 它们往往在系统启动时启动, 并保持在后台运行。 kill命令用来终止进程, 其工作的原理是向系统的内核发送一个系统操作信号和某个程序的进程标识号, 然后系统内核就可以对进程标识号指定的进程进行操作。

测试表达式: test 用法:test EXPRESSION

该命令用于测试表达式EXPRESSION的值, 根据测试结果返回0(测试失败) 或1(测试成功)

第12章 Shell编程基础

1.变量

变量有局部变量、 环境变量之分。在脚本中, 往往需要使用变量来存储有用
信息, 比如文件名、 路径名、 数值等, 通过这些变量可以控制脚本的运行行为。 注意Shell的变量是区分大小写的。

局部变量

所谓局部变量就是指在某个Shell中生效的变量, 对其他Shell来说无效, 而且会随着当前Shell的消失而消失, 局部变量的作用域被限定在声明它们的Shell中, 可以使用local内建命令来“显式”的声明局部变量, 但仅限于函数内使用。

环境变量

环境变量通常又称“全局变量”, 以区别于局部变量。环境变量不仅仅是对于该Shell生效, 对其子Shell也同样生效。

在Shell脚本中, 变量默认就是全局的, 无论在脚本的任何位置声明, 但是为了让子Shell继承当前Shell的变量, 则可以使用export内建命令将其导出为环境变量

环境变量可用在创建变量的Shell和从该Shell派生的任意子Shell或进程中(使用export内建命令将变量导出为环境变量) , 因此, 环境变量通常又被称作全局变量。 环境变量被创建时所处的Shell被称为父Shell, 如果在父Shell中再创建一个Shell, 则该Shell被称作子Shell。 当子Shell产生时, 它会继承父Shell的环境变量为自己所用, 所以说环境变量可从父Shell传给子Shell。环境变量只能向下传递而不能向上传递, 即“传子不传父” 。

通过echo命令查看变量

变量:PATH 代表命令的搜索路径

# 重设PATH变量, 增加/some/path至原来的PATH中
export PATH=/some/path:$PATH

变量赋值:

注意点1:变量名和变量值之间用等号紧紧相连,之间没有任何空格

注意点2:当变量中有空格时必须用引号括起,否则会出现错误

变量的取值只需要在变量名前加上 $ 符号既可, 严谨一点的写法是${}

取消变量:取消变量指的是将变量从内存中释放, 使用的命令是unset, 后面跟变量名。

特殊变量:

位置参数: Shell中还有一些预先定义的特殊只读变量, 它们的值只有在脚本运行时才能确定。 首先是“位置参数”, 位置参数的命名简单直接, 比如, 脚本本身为$0, 第一个参数为$1, 第二个参数为$2, 第三个为3 , 以 此 类 推 。 当 位 置 参 数 的 个 数 大 于 9 时 , 需 要 用 3, 以此类推。 当位置参数的个数大于9时,需要用39{}括起来标识, 比如说第10个位置参数应该记为${10}。另外, $#表示脚本参数的个数总和, @ 或 @或@*表示脚本的所有参数。
在这里插入图片描述

2.引用

Shell中有两类字符, 一类是普通字符, 在Shell中除了本身的字面意思外没有其他特殊意义, 即普通纯文本(literal) ; 另一类即元字符(meta), 是Shell的保留字符。

引用是指将字符串用某种符号括起来, 以防止特殊字符被解析为其他意思。Shell中一共有4种引用符,分别是双引号、 单引号、 反引号(在键盘上和波浪号位于同一个键) 和转义符。 其中双引号又叫“部分引用”或“弱引用”, 可以引用除$符、 反引号、 转义符之外的所有字符; 单引号又叫“全引用”或“强引用”, 可以引用所有字符; 反引号则会将反引号括起的内容解释为系统命令。

部分引用:部分引用是指用双引号括起来的引用

全引用:全引用是指用单引号括起来的引用。 单引号中的任何字符都只当作是普通字符 。所有在单引号中的字符都只能代表其作为字符的字面意义 。
在这里插入图片描述

输出内容就是单引号所括起来的所有内容, 而不会将变量解析为其值。

算术运算:

使用[ ] 做 运 算 : []做运算 :[][]和$(())类似, 可用于简单的算术运算

使用expr做运算:expr命令也可用于整数运算。 和其他算术运算方式不同, expr要求操作数和操作符之间使用空格隔开(否则只会打印出字符串),所以特殊的操作符要使用转义符转义(比如*)。expr支持的算术运算符有加、 减、 乘、 除、 余等。在这里插入图片描述

算术扩展:算术扩展是Shell提供的整数变量的运算机制,是Shell的内建命令之一。基本语法:$(( 算术表达式))

3.判断

# if/elif/else判断结构
if expression1; then
				command1
elif expression2; then
				command2
...
fi
# case判断结构
case VAR in
var1) command1 ;;
var2) command2 ;;
var3) command3 ;;
...
*) command ;;
esac
# 其原理为从上到下依次比较VAR和var1、 var2、var3的值是否相等, 如果匹配相等则执行后面的命令语句, 在无一匹配的情况下匹配最后的默认*,并执行后面的默认命令。 要注意的是, case判断结构中的var1、 var2、 var3等这些值只能是常量或正则表达式。

4.循环

Shell中的循环主要有for、 while、 until、 select几种。

for循环是Shell中最常见的循环结构, 根据书写习惯又分为列表for循环、 不带列表的for循环以及类C的for循环

带列表的for循环:带列表的for循环用于执行一定次数的循环(循环次数等于列表元素个数)

for VARIABLE in (list)
do 
		command
done

不带列表的for循环:

for VARIABLE
do
		command
done
# 使用不带列表的for循环时, 需要在运行脚本时通过参数的方式给for循环传递变量值。

[root@localhost ~]# cat for_list07.sh 
#!/bin/bash
for VARIABLE in $@
do
echo -n $VARIABLE
done
#运行时传入参数
[root@localhost ~]# bash for_list07.sh 1 2 3
1 2 3

类C的for循环:

for((expression1;expression2;expression3))
do
	command
done

[root@localhost ~]# cat c_for01.sh
#!/bin/bash
for ((i=1; i<=10; i++))
do
echo -n "$i "
done
echo
#运行结果
[root@localhost ~]# bash c_for01.sh
1 2 3 4 5 6 7 8 9 10

while循环

while expression
do
		command
done

5.函数

在Shell中定义函数:

#其中function为关键字, FUNCTION_NAME为函数名
function FUNCTION_NAME(){
	command1
    #函数体中可以有多个语句, 不允许有空语句
	command2
	...
}  
# 也可以省略关键字
# 调用函数的方法时只要调用函数名即可

第13章 重定向

所谓“重定向”, 就是将原本应该从标准输入设备(键盘)输入的数据, 改由其他文件或设备输入;或将原本应该输出到标准输出设备(显示器) 的内容, 改而
输出到其他文件或设备上。

文件标识符和标准输入输出 :

文件标识符是重定向中很重要的一个概念,Linux使用0到9的整数指明了与特定进程相关的数据流, 系统在启动一个进程的同时会为该进程打开三个文件: 标准输入(stdin) 、 标准输出(stdout) 、 标准错误输出(stderr) , 分别用文件
标识符0、 1、 2来标识。 如果要为进程打开其他的输入输出, 则需要从整数3开始标识。 默认情况下, 标准输入为键盘, 标准输出和错误输出为显示器 。

I/O重定向

I/O重定向符号和用法 :

I/O重定向是重定向中的一个重要部分, 在Shell编程中会有很多机会用到这个功能。 简单来说,I/O重定向可以将任何文件、 命令、 脚本、 程序或脚本的输出重定向到另外一个文件、 命令、 程序或脚本。

I/O重定向常见符号和功能描述如表所示

常见的I/O重定向符号

符号含义
>标准输出覆盖重定向:将命令的输出 重定向输出到其他文件总
>>标准输出追加重定向:将命令的输出重定向输出到其他文件中,同时会覆盖文件中已有内容
>&标识输出重定向:将一个标识的输出重定向到另一个标识的输入
<标准输入重定向:命令将从执行文件中读取输入而不是从键盘输入
|管道:从一个命令中读取输出并作为另一个命令的输入

标准输入重定向:<

标准输入重定向可以将原本应由从标准输入设备中读取的内容转由文件内容输入, 也就是将文件内容写入标准输入中 。

安装C/C++环境

# 安装C++环境
yum install gcc
yum install gcc-c++
# 编译C++
g++ main.cpp            //生成.out  文件
./main.out或者g++ main.cpp -o main.out或者g++ main.cpp -o main这样生成的三个文件内容是一样的
源文件 --- 预处理 --- 编译 --- 汇编 --- 链接 --- 可执行文件

在这里插入图片描述

vim代码对齐:(1)退出编辑模式,按v进入可视化模型,按上下键选中代码,再按等号键,代码对齐

切换函数man手册:shift+k 按下qq退出

代码自动补齐:ctrl+p

文件IO就是直接调用系统内核提供的系统调用函数,如open;

标准IO就是间接调用系统调用函数,是C库函数,如fopen。

文件IO和标准IO的区别?

文件IO是直接调用系统内核提供的系统调用函数,头文件是unistd.h;标准IO是间接调用系统函数,头文件是stdio.h

文件IO是依赖于操作系统的;标准IO是不依赖于操作系统的。所以在任何操作系统下,使用标准IO,也就是C库函数操作文件的方法都是相同的。

img

man手册

man手册目录结构:

名称含义
NAME名称
SYNOPSIS命令语法(又称摘要)
DESCRIPTION命令完整描述
AUTHOR作者
REPORTING BUGS报告的错误
COPYRIGHT版权
SEE ALSO查看相关信息

在man手册中,各类命令分为9大section:

section序号section的含义
1可执行文件和shell命令
2系统调用(内核提供的函数)
3库函数
4特殊文本(通常在/dev)
5文件格式,如/etc/passwd
6游戏
7杂项(包括宏包)
8系统管理员命令(通常给root用户使用)
9内核例程(非标准例程)

man手册查询查用命令和功能

  • man <keyword>:查询任意关键词(不包括结构体,类型定义),但由于存在同名关键词,如read(1)(shell命令)与read(2)(linux系统调用),这样查询只会显示位于前面的手册,如man read显示read(1)结果,这时就需要指定手册序号。
  • man 1 <program or shell command>:查询可执行程序或shell命令的用法,如:man 1 cd, man 1 ls等;
  • man 2 <system-call>:查询系统调用相关信息,如man 2 readman 2 write等。
  • man 3 <lib-call>:查询C语言库函数相关信息,如man 3 printfman 3 exit等。
  • man 7 <option>:查询杂项,如man 7 socketman 7 ip等。
  • man -K <struct name>:可以用来查询不知道具体在哪个手册页的(函数、结构体、类型)定义,如man -K sockaddr_in

Linux目录结构

img

  • /bin
    bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。

  • /boot:
    这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。

  • /dev :
    dev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的。

  • /etc:
    etc 是 Etcetera(等等) 的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录。

  • /home
    用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的,如上图中的 alice、bob 和 eve。

  • /lib
    lib 是 Library(库) 的缩写这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库。

  • /lost+found
    这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。

  • /media
    linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux 会把识别的设备挂载到这个目录下。

  • /mnt
    系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在 /mnt/ 上,然后进入该目录就可以查看光驱里的内容了。

  • /opt
    opt 是 optional(可选) 的缩写,这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。

  • /proc
    proc 是 Processes(进程) 的缩写,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。

  • /root
    该目录为系统管理员,也称作超级权限者的用户主目录。

  • /sbin
    s 就是 Super User 的意思,是 Superuser Binaries (超级用户的二进制文件) 的缩写,这里存放的是系统管理员使用的系统管理程序。

  • /selinux
    这个目录是 Redhat/CentOS 所特有的目录,Selinux 是一个安全机制,类似于 windows 的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。

  • /srv
    该目录存放一些服务启动之后需要提取的数据。

  • /sys

    这是 Linux2.6 内核的一个很大的变化。该目录下安装了 2.6 内核中新出现的一个文件系统 sysfs 。

    sysfs 文件系统集成了下面3种文件系统的信息:针对进程信息的 proc 文件系统、针对设备的 devfs 文件系统以及针对伪终端的 devpts 文件系统。

    该文件系统是内核设备树的一个直观反映。

    当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。

  • /tmp
    tmp 是 temporary(临时) 的缩写这个目录是用来存放一些临时文件的。

  • /usr
    usr 是 unix shared resources(共享资源) 的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录。

  • /usr/bin:
    系统用户使用的应用程序。

  • /usr/sbin:
    超级用户使用的比较高级的管理程序和系统守护程序。

  • /usr/src:
    内核源代码默认的放置目录。

  • /var
    var 是 variable(变量) 的缩写,这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。

  • /run
    是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。

在 Linux 系统中,有几个目录是比较重要的,平时需要注意不要误删除或者随意更改内部文件。

/etc: 上边也提到了,这个是系统中的配置文件,如果你更改了该目录下的某个文件可能会导致系统不能启动。

/bin, /sbin, /usr/bin, /usr/sbin: 这是系统预设的执行文件的放置目录,比如 ls 就是在 /bin/ls 目录下的。

值得提出的是 /bin/usr/bin 是给系统用户使用的指令(除 root 外的通用用户),而/sbin, /usr/sbin 则是给 root 使用的指令。

/var: 这是一个非常重要的目录,系统上跑了很多程序,那么每个程序都会有相应的日志产生,而这些日志就被记录到这个目录下,具体在 /var/log 目录下,另外 mail 的预设放置也是在这里。

务启动之后需要提取的数据。

  • /sys

    这是 Linux2.6 内核的一个很大的变化。该目录下安装了 2.6 内核中新出现的一个文件系统 sysfs 。

    sysfs 文件系统集成了下面3种文件系统的信息:针对进程信息的 proc 文件系统、针对设备的 devfs 文件系统以及针对伪终端的 devpts 文件系统。

    该文件系统是内核设备树的一个直观反映。

    当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。

  • /tmp
    tmp 是 temporary(临时) 的缩写这个目录是用来存放一些临时文件的。

  • /usr
    usr 是 unix shared resources(共享资源) 的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录。

  • /usr/bin:
    系统用户使用的应用程序。

  • /usr/sbin:
    超级用户使用的比较高级的管理程序和系统守护程序。

  • /usr/src:
    内核源代码默认的放置目录。

  • /var
    var 是 variable(变量) 的缩写,这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。

  • /run
    是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。

在 Linux 系统中,有几个目录是比较重要的,平时需要注意不要误删除或者随意更改内部文件。

/etc: 上边也提到了,这个是系统中的配置文件,如果你更改了该目录下的某个文件可能会导致系统不能启动。

/bin, /sbin, /usr/bin, /usr/sbin: 这是系统预设的执行文件的放置目录,比如 ls 就是在 /bin/ls 目录下的。

值得提出的是 /bin/usr/bin 是给系统用户使用的指令(除 root 外的通用用户),而/sbin, /usr/sbin 则是给 root 使用的指令。

/var: 这是一个非常重要的目录,系统上跑了很多程序,那么每个程序都会有相应的日志产生,而这些日志就被记录到这个目录下,具体在 /var/log 目录下,另外 mail 的预设放置也是在这里。


版权声明:本文为lwd906485829原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。