很多命令的介绍,大多数是讲命令的语法、命令有多少选项、可用什么参数、常用案例是什么。真正讲命令执行的底层逻辑的很少。
本文不再介绍常规知识点,仅就history命令执行的底层逻辑与root用户如何查看普通用户的历史命令介绍一下。
首先,我们要了解的是:程序(进程)运行在内存中;配置文件、存盘文件保存在外存(磁盘)中;当进程需要外部文件时,要加载文件到内存中,然后显示、修改、使用。而加载文件实质是复制文件数据到内存中(更专业的术语是映射)。
一、底层逻辑
1.基础
全面理解history命令,需要掌握几个重要概念。
缓存——从广义上讲,缓存存在于电脑的许多配件上,比如CPU有一级、二级甚至三级缓存。缓存技术的应用,可以提升硬件的数据读取和处理速度。硬盘的缓存主要起三种作用:一是预读取;二是对写入动作进行缓存;第三个作用就是临时存储最近访问过的数据。
本文称后续的用于保存历史命令的缓存区称为历史缓存。
内存——计算机内存是计算机的重要部件,它用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。内存是外存与CPU进行沟通的桥梁,计算机中所有程序的运行都在内存中进行。
history保存文件——默认情况下,命令历史被储存在.bash_history文件中。可以通过环境变量来改变为其他位置。本文称保存历史命令的文件为历史文件。
history配置文件——能影响history功能的配置文件有多个,主要有/etc/profile、~/.bashrc和~/.bash_profile。
history的默认的,只会输出命令的序号以及命令。这时我们就需要对history进行一些配置,让它报告(显示)命令执行的更多信息。
history环境变量——和history相关的环境变量有很多,我们仅列出部分,供讨论。
HISTSIZE;HISTFILE;HISTFILESIZE;HISTTIMEFORMAT;ISTIGNORE;HISTCONTROL
2.执行逻辑
命令执行的信息按时间保存在shell程序的历史缓存中;
启动一个终端会话时,占用一定大小的内存,在其中还同时创建了一段缓存区(历史缓存——及时记录会话中执行过的命令)。
一个会话对应一个历史缓存,多个会话的历史缓存相互独立。
当启动一个会话时,历史缓存会自动加载历史文件内容。