我们回顾一下上一节所讲的知识,我们知道了如何获取帮助,在内部我们可使用help COMMAND,而外部命令我们使用man或--help及info,以及可以查看官方自带的文档(ReadME, CHANGELOG, INSTALL),还有就是发行版的文档以及上网搜索(推荐使用谷歌),那么我们如果想查看那个命令在手册中属于那个章节,使用whatis命令就可以。
  在最后我们总结一下基础命令:之后我们这一章开始讲述Linux的文件系统。以及介绍bash特性。

   pwd, cd, ls, echo, date, clock, cal, hwclock, cat, tac, file, type, tty, halt, poweroff, shutdown, reboot

一、Linux文件系统

  我们都知道,程序源码写完之后都要进行编译成二进制程序才能运行,如果不依赖于库文件的话,从系统调用接口直接写程序的话,我们称之为静态编译,也就是说,程序里的库文件是自带的,不过该程序是会很大的,因为它把库文件都编译进去了,好处是不用依赖系统上的库文件,可直接运行。而动态编译是要依赖于调用系统上的库文件进行编译和运行,好处是占用体积较小。那么Linux的库编译是glibc工具,我们将程序执行载入并内存时它就是一个进程,用户人为启动某个程序时,是要通过终端来启动,这就是与终端相关的进程,而终端是一个硬件设备,它关联一个用户的接口,另一种是与终端无关的进程,它是通过操作引导启动过程当中自动启动。没有人为的参与。

1.1 操作系统的层级结构组成

  在我们之前也讲过操作系统的组成部分,从静态角度来说就是内核Kernel和GPL等开源协议的应用程序Application来组成,那么文件系统是内核当中必须有的一个功能,在Linux的层级结构是倒装的数置结构,我们都知道普天之下莫非王土,率土之兵莫非王臣。说明我们访问Linux的文件系统时,一切都是从"根"开始,也就是该符号/,而下面的是根据FHS(文件系统层次化标准)所定制的根一下的目录一下必须存放什么样的数据和目录,成为了各个厂商以及开发者的统一采用标准。如果不是统一,而是根据各个厂商及开发者开发的话,那对于我们使用者来说,是一件痛苦的事情。FHS的层级结构目录如下:

   /bin:所有用户可用的基本程序文件;
   /sbin:供系统管理员使用的工具程序;
   /dev:存储特殊设备文件;
	设备有两种过类型:字符设备(线性设备)、块设备(随机设备);
   /etc:系统程序的配置文件,只能为静态的文本文件;
   /home:普通家目录的集中位置:一般每个普通用户的家目录默认在此目录下与用户名的子目录,/home/USERNAME;
   /root:管理员的家目录;可选;
   /lib:为系统启动或根文件系统上的应用程序(/bin, /sbin)提供共享库,以及内核提供模块;
	libc.so.*:动态连接的C库;
	ld*:运行时链接器/加载器;
	modules:用于存储内核模块的目录;
   /lib64:64位系统特有的存放64位共享库的路径;
   /media:便捷式设备的挂载点,cdrom, floppy等;
   /mnt:其它文件系统临时挂载点;
   /opt:附加应用程序的安装位置;可选路径;
   /srv:当前主机为服务器提供的数据;
   /tmp:为那些会产生临时文件的程序提供的用于存储临时文件的目录;可提供所有用户执行写入操作;有特殊权限;
   /usr:usr Hierarchy, 全局共享的只读数据路径;
	bin, sbin
	lib, lib64
	include:C语言程序文件
	share:命令手册页和自带文档框架持有的文件所存储的位置;
	local:另一个层级目录;
	lock:
	log:
	run:
	spool:
	tmp
   /proc:(内核的输出信息是通过内核参数来实现的)
   基于内存的虚拟文件系统,用于内核及进程存储其相关信息;它们多位内核参数,例如:net.ipv4.ip_forward,虚拟为net/ipv4/ip_forward,存储于/proc/sys/,因此其完整路径为/proc/sys/net/ip_forward;
   /sys:sysfs虚拟文件系统提供了一种比proc更为理想的访问内核数据的途径;其主要作用在于管理Linux设备提供一种统一模型的接口;

  总结:Linux内核中有文件系统功能,而这个文件系统是关联在内核上面,内核可以通过这个文件系统访问任何一个文件,必要的时候让一个程序启动起来,访问自己的配置文件,而内核也不例外,它也是某个磁盘路径下的某个文件,但我们分区时,这些分区不能随意分开并访问,所以一切都从根开始,在根以下的目录找到一个空目录,关联其它设备,称之为挂载(大致上的FHS)。

二、Linux系统上的文件类型

  我们在使用ls -l命令的时候可以详细查看该文件或目录的详细信息及大小,那么其实最左侧的第一个-是系统上的文件类型,有几下几类,如下示例:

   -:常规文件;即f;
   d:directory,目录文件;
   b:block device,块设备文件,支持以"block"为单位进行随机访问;
   c:character device,字符设备文件,支持以"charactor"为单位进行线性访问;
	major number:主设备号,用于标识设备类型,进而确定要加载的驱动程序;
	minjor number:次设备号,用于表示同一类型中的不同设备;
		早期用8位二进制表示:0-255
   l:symbolic link,符号设备文件;
   p:pipe,命令管道;
   s:socket,套接字文件;

2.1 基本命令

2.1.1 alias命令

  我们现在都知道,类型分为内部命令和外部命令,内部命令就是shell内嵌的命令,但shell命令本身是外部的,但在shell内包含着许多命令,那么命令格式我们也讲过,就是type COMMAND如果是内部命令就会显示builtin,那么外部就会显示其命令文件的存放路径,不过需要注意的是,命令是可以有别名的;如果别名可以与原名相同,那么此时原名就会隐藏,以CentOSDebian为例,它们的rm命令的作用是不同的,因为在CentOS中,rm命令其实是别名,它是rm="rm -i"就是将rm -i这个命令替换为rm命令,-i选项是删除之前询问,如果不加入这个选项的话,则会直接删除,Debian就是默认没有这个别名。那么接下来我们如何用别名来将命令进行替换。
  那么获取可用别名的定义我们直接使用
alias来直接查看:

   # alias

  那么我们如何定义别名的格式如下:

   # alias NAME=COMMAND

  需要注意的是,这一类的别名仅对当前的shell进程有效(退出分为两种概念,一种是时间上的终止,还有一个是范围终止这两个概念,时间终止为:shell退出;范围终止:指的是当前shell)。
  撤销别名:

   # unalias NAME

2.1.2 whereis命令

  whereis命令是查找该命令的路径存放的二进制文件,以及手册页等存放的位置,其命令格式为:

   # whereis [OPTIONS] name...

  常用选项:

   -b:仅搜索二进制程序路径;
   -m:仅搜索使用手册文件路径;

2.1.3 which命令

  which命令是查找环境变量中的二进制的文件,不过有些命令是别名的默认也是显示出来。

   # which [OPTIONS] [--] programname [...]

  我们最常用的选项:

   --skip-alias:跳过别名;

2.1.4 who命令

  who命令无非就是查看是那个用户在登录,命令使用如下:

   # who [OPTIONS]...

  选项如下:

   -b:系统此次启动的时间;
   -r:运行级别;

2.1.5 w命令

  w命令是显示目录登录用户的信息。

三、bash的基础特性

3.1 历史命令

  我们在系统中操作某一个程序或者配置一个服务的时候,如果哪一个步骤出现了错误我们并没有找到的话,我们可以查看一下历史命令来看看我们使用的命令操作是否正确,所以说历史命令是shell进程会其会话中保存此用户提交执行过的命令,而我们使用的命令为:history。同时我们还可以定制history的功能,可通过环境变量来实现:

   HISTSIZE:shell进程可保留的命令历史条数;
   HISTFILE:持久保存命令历史的文件;
	.bash_history
   HISTFILESIZE:命令历史文件的大小;

  命令用法:

   # history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg [arg...]

  常用选项:

   -c:清空命令历史;
   -d offset:删除指定命令历史;
   -r:从文件读取命令历史至历史列表中;
   -w:把历史列表中的命令追加至历史文件中;
   history #:显示最近的#条命令;

  我们还可以调用历史列表中的命令,用法如下:

   !#:再一次执行历史列表中的第#条命令;
   !!:再一次执行上一条命令;
   !STRING:再一次执行命令历史列表中最近一个以STRING开头的命令;

  需要注意的是,命令的重复执行有时候需要依赖于幂等性。幂等性简单理解就是重复命令次数特别高的。
  我们也可以调用上一条命令的最后一个参数,使用如下:

   快捷键:ESC, . 和Alt, .(Linux中)

   字符串:!$

  我们还可以控制命令历史的记录方式,可以忽略重复的或者忽略以空白字符开头以及以上两者同时生效的,我们可使用环境变量HISTCONTROL来实现,其更改的值如下:

   ignoredups:忽略重复的命令;
   igonresoace:忽略以空白字符开头的命令;
   ignoreboth:以上两者同时生效;

  而我们给变量,无论是环境变量还是普通变量,需要注意的是只对当前shell有效,赋予个修改的变量的值如下:

   NAME=`VALUE`