我们回顾一下上一节所讲的知识,我们知道了如何获取帮助,在内部我们可使用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,那么外部就会显示其命令文件的存放路径,不过需要注意的是,命令是可以有别名的;如果别名可以与原名相同,那么此时原名就会隐藏,以CentOS
和Debian
为例,它们的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`
转载于:https://blog.51cto.com/tianxie/1975650