Linux history 命令相关使用以及配置

news2024/11/17 2:57:40

Linux history 命令相关使用以及配置

Linux history

新手学习 shell 的时候都知道 history 命令能帮助我们查看之前运行的命令集合,通过这个能够帮我们回忆之前的命令,以及进行各种排错等等。

比如我们直接输入 history 进行查看:

history [N]
history 5 # 仅仅显示最后5行

history 使用

history [N]

查看最后 5 条历史命令

history 5

history -c

清空历史命令

history -c

history -d offset

指定删除第几个命令的记录

history -d 100 # 删除第100条命令

history -anrw [filename]

-a 追加本次会话执行的命令历史列表,保存到历史文件中。

-n 将历史文件中新增的部分加载到内存中,可以方便多端同步。

-r 读取历史文件中的所有命令在内存中,即使已经加载过

-w 将历史文件写出到 [filename] 中

history -anrw /root/.bash_history

ps: 使用 man 命令可以查看 history 的详细使用

在这里插入图片描述

history -p arg [arg …]

进行打印,但是不记录在历史记录中,有点像 echo arg[arg…] 但并不会被历史命令记录

history -p  $HISTTIMEFORMAT 
# 但如果有空格则会换行进行打印

在这里插入图片描述

history -s arg [arg …]

伪造命令,相当于直接添加这条命令到历史记录中,但并不会真正执行

history -s rm -rf /*
# 构造了一条 rm -rf /* 的命令

history 配置

HISTTIMEFORMAT hisotry 打印格式

如上面所示,我们在查看历史记录的时候,并没有记录这条命令的运行时间,但其实是可以配置的。

vim /etc/bashrc
# or
vim /etc/profile
# or
vim /etc/profile.d/history.sh #最推荐这个

# 在这些文件中追加
export HISTTIMEFORMAT="%Y-%m-%d %H:%M "
# 注意初次更改时,之前的命令会记录为更改的时刻。

可以看到,如果我们将 HISTTIMEFORMAT 更改为对应的 format 格式,那么 history 命令打印的格式也会变更。甚至我们可以在上面运行一些其他命令当做参数补充:

export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S  `who am i | awk '{print $1,$5}'` "

在这里插入图片描述

配置历史记录最大条数

之前的篇幅讲过,在我们的环境变量里面有一个变量可以更改我们 history 命令的最大长度,默认是 1000:

set |grep HISTSIZE # 定义的是 history 输出命令的记录数
# HISTSIZE=1000
set |grep HISTFILESIZE # 定义的是 .bash_history 中的记录总数
# HISTFILESIZE =1000

这个参数在 /etc/profile 中被定义:

cat /etc/profile |grep HISTSIZE
# HISTSIZE=1000
# export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL

在这里插入图片描述

可以看到,这个参数也是在 /etc/profile.d/* 之前被定义的,所以如果我们想更改也可以

echo 'export HISTSIZE=2000' >> /etc/profile.d/history.sh
echo 'export HISTFILESIZE=2000' >> /etc/profile.d/history.sh
chmod 755 /etc/profile.d/history.sh

HISTSIZE & HISTFILESIZE

HISTSIZE 标示在 history 命令中,要记录的命令数量

如果为 0, 则不进行记录

如果小于 0,则永远记录

如果大于 0,则仅记录这个数值

HISTFILESIZE 标示在历史文件 .bash_history 中的记录数。

如果为 0, 则不进行记录

如果小于 0,则永远记录

如果大于 0,则仅记录这个数值

当 shell 退出时,才会将缓存中的数据写出到这个文件。

HISTIGNORE

这个变量是运维比较头疼的环境变量,可以忽略某些常见命令,不保存在命令历史中。

export HISTIGNORE="pwd:df:du:rd*" # 以:为分隔符进行切分匹配
rd1
rd2
rd3
4rd
r5d
history | tail

在这里插入图片描述

可以看到,我们配置忽略 rd 开头的命令后,前面执行的三条命令不存在了,只剩下 4rd 和 r5d 两条命令。

HISTFILE

这个变量决定了我们的 history 文件写出在哪里,默认为本用户目录下的 .bash_history 文件。

echo $$HISTFILE
# ~/.bash_history

在这里插入图片描述

当然当我们启动 bash 的时候,变量 $HISTFILE 所指向的文件会被读取,让当前会话能够加载之前的历史命令。

histappend

if (history_lines_this_session <= where_history() || force_append_history)
    append_history (history_lines_this_session, hf);
else
    write_history (hf);
sv_histsize ("HISTFILESIZE");

当存储到文件时,Bash 会将此前会话中的命令直接存储到文件末尾,如果文件的记录数大于定义的最大记录数,则清空旧的历史命令,并且当下次再存储时会重写此前文件。

如果 histappend (force_append_history)设置是启动的,那么当前会话退出时,最后执行的 $HISTSIZE 行会被拷贝进 $HISTFILE 中,不考虑大小。

# 使用 shopt (shell option) 来查看 histappend 是否开启
shopt histappend 
# histappend      on

在这里插入图片描述

命令记录模式

存储操作最终还是归集于存储介质的读写操作,如对文件的读写,增加的只是对业务逻辑规则的各种限制。

命令可以在执行命令时记录,也可以在命令刚输入,但已经识别的情况下记录,Bash 属于后者。

Bash 在 yacc 做语法分析时将用户输入的命令通过 maybe_add_history 函数写入到当前会话的命令历史记录表中。

在做语法分析时就已经记录了用户输入的命令,此时记录就不用管命令最终的结果是怎样,也不用管如果执行过程出了异常会怎样处理。

它只是如实的在执行前记录用户输入的什么命令,由此,我们可以知道 Bash 的命令历史记录的定义为用户输入的命令历史记录。

多终端问题

我们知道相同的用户也可以在同一台服务器开启多个终端,那么这些终端都会产生不同的历史记录:

在这里插入图片描述

当我们用户退出当前会话的时候,才会把缓存中的内容写入到 ~/.bash_history 中,那么意味着如果我当前终端不释放,其他终端是感知不到我当前终端运行的命令。

~/.bash_history 在之前也讲过,是存储最后 $HISTFILESIZE 条历史命令的。

如果我们想要一个用户的多端都同步历史 shell 命令可以这样配置

export PROMPT_COMMAND='history -a;history -r;'

但十分不推荐这样做,因为很多时候其实我们并不希望多端同步,而且会花费较多性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/30327.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flutter高仿微信-第20篇-支付-充值

Flutter高仿微信系列共59篇&#xff0c;从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图&#xff1a; 实现代码&#xff1a; /*** Author : wangning* Email : maoning20080809163.…

Android AIDL跨进程通信基础(多端情况)

简介 AIDL建议在来自不同的客户端访问你的服务并且需要处理多线程问题时你才必须使用AIDL&#xff0c;其他情况下你都可以选择其他方法&#xff0c;如使用 Messenger&#xff0c;也能跨进程通信。可见 AIDL 是处理多线程、多客户端并发访问的&#xff0c;而 Messenger 是单线程…

年末盘点时间——用Python绘制饼状图对商品库存进行分析

人生苦短&#xff0c;我用python 存货盘点最重要的是什么&#xff0c;盘点比例要达到&#xff0c; 比如说要达到80%&#xff0c;于是就拿着企业给导的进销存明细表&#xff0c; 于是就开始筛选大金额的存货作为选择的样本&#xff0c; 这样就够比例了。 可是实际盘点的时候…

手把手教你在ARM板上写一个驱动程序!

摘要&#xff1a;搞嵌入式有两个方向&#xff0c;一个是嵌入式软件开发(MCU方向)&#xff0c;另一个是嵌入式软件开发(Linux方向)。其中MCU方向基本是裸机开发和RTOS开发。而Linux开发方向又分为驱动开发和应用开发。其中应用开发相比于驱动开发来说简单一些&#xff0c;因为搞…

初阶指针---从入门到入坟

今天我们来见识一下c语言里让万千少年少女从入门到入坟的一道大门槛——指针 目录 1.指针是什么&#xff1f; 2.指针和指针类型 3.野指针 4. 指针运算 5. 指针和数组 6. 二级指针 7. 指针数组 1.指针是什么&#xff1f; 指针理解的2个要点&#xff1a; 1. 指针是内存中一…

C语言:计算阶乘与计算从1加到100的代码对比:都要用到3个变量,不同之处在于表达式

计算1 到 100 之间所有整数之和 #include <stdio.h> int main() {int i1,total0;while(i<100)//不能在 while 后面加分号{totali;i;//循环内要有使循环趋近于假的操作}printf("%d\n",total);return 0; } 和下面对比&#xff0c;只不过是100用输入j来代替了 …

将windows的显示器作为linux的扩展屏

这里写自定义目录标题前言WinLinuxRequirementsBuild and install运行前言 测试的linux系统为ubuntu 18.04测试的windows系统为win10将windows的显示器作为linux的扩展屏&#xff0c;需要使用微软的Miracast技术。windows自带就不多说了&#xff0c;linux使用的是这个开源软件…

MATLAB绘图合集:填充二维等高线图contourf

本文主要介绍填充的二维等高线图和基本的用法例子 目录 说明 例子 绘制10个层级的等高线 显示具有标签的特定层级的等高线图 自定义等高线线宽 说明 contourf(Z) 创建一个包含矩阵 Z 的等值线的填充等高线图&#xff0c;其中 Z 包含 x-y 平面上的高度值。MATLAB会自动选择…

【第六部分 | JavaScript高级】3:正则表达式

目录 【第三章】正则表达式&#xff08;重点&#xff09; | 概述 | 创建正则表达式 | 测试某个字符串是否符合正则 | 正则符号 什么是正则符号&#xff1f; 1.1.边界符 ^ $ 1.2.连字符 - 2.1.字符类—方括号符 [] 2.2.字符类—方括号符内 范围符 - &#xff08;易错&a…

nacos服务注册源码过程阅读

准备部分 这是在真正调用注册实例的方法之前&#xff0c;需要使用到的对象的关系图。 源码跟踪 NacosServiceRegistryAutoConfiguration类 Configuration(proxyBeanMethods false) EnableConfigurationProperties ConditionalOnNacosDiscoveryEnabled ConditionalOnPropert…

C语言学习之路(基础篇)—— 内存管理

说明&#xff1a;该篇博客是博主一字一码编写的&#xff0c;实属不易&#xff0c;请尊重原创&#xff0c;谢谢大家&#xff01; 作用域 C语言变量的作用域分为&#xff1a; 代码块作用域(代码块是{}之间的一段代码)函数作用域文件作用域 1) 局部变量 生命周期&#xff1a;…

Python 基础(一):初识 Python

文章目录Python是什么解释型语言Python 之父Python 名字的由来Python 的应用领域人生苦短&#xff0c;我用 Python大家好&#xff0c;我是水滴~~ 本文对 Python 做了一个初步的介绍&#xff0c;并了解 Python 的作者、名字由来、应用领域等。 Python是什么 Python 是一种面向…

什么是软件测试?

什么是软件测试&#xff1f; 软件测试的定义&#xff1a;在一定条件下对软件进行操作&#xff0c;发现软件的问题&#xff0c;提高软件的质量。 软件测试在开发中的有着重要地位。软件测试在各阶段的完成相应的任务&#xff0c;需求测试&#xff0c;架构测试&#xff0c;详细测…

C语言条件运算符——三元表达式例题(素材来自C技能树)

&#x1f4d1;三目运算符 三目运算符也叫条件运算符、三元运算符&#xff0c;是由一个问号和一个冒号组成。语法&#xff1a;表达式1?表达式2:表达式3;语义&#xff1a;先执行表达式1&#xff0c;如果表达式1的结果如果为真&#xff0c;那么执行表达式2&#xff0c;并且这个整…

level2接口有什么用?是如何获取A股行情数据的?

目前国内有很多数据团队专门为金融机构、学术团体和量化研究者们提供的本地量化金融数据服务&#xff0c;那么最常见的就是通达信、同花顺等团队&#xff0c;他们开发出来的level2接口可快速查看和计算金融数据&#xff0c;无障碍解决本地、Web、金融终端调用数据的需求。为了满…

彻底解决 K8s 节点本地存储被撑爆的问题

一、存储的内容 要解决存储使用过多的问题&#xff0c;就得先了解存储中都保存了些什么内容&#xff0c;否则解决不了问题&#xff0c;还可能带来更多的风险。 1.1、镜像 容器要在节点上运行&#xff0c;kubelet 首先要拉取容器镜像到节点本地&#xff0c;然后再根据镜像创建…

3分钟读懂RD与RT

Route-Distinguisher&#xff08;后简称"RD"&#xff09;&#xff0c;Route-Target&#xff08;后简称"RT"&#xff09;经常出现在EVPN、MPLS VPN中&#xff0c;但它们是完全不同的两个概念&#xff0c;初学者往往难以区分两者的差异。学霸题&#xff1a;区…

Jmeter入门

性能测试&#xff1a;模拟多个用户的操作对服务器硬件性能的影响 TPS&#xff1a;Transaction per Second&#xff0c;每秒事务处理能力 RT&#xff1a;Response Time&#xff0c;响应时间 安装 由于本人只有window系统&#xff0c;故只讲解win下的安装 安装JDK 下载地址&a…

2023年最热门的网络安全岗位分析

大数据、人工智能、云计算、物联网、5G等新兴技术的高速发展&#xff0c;蒸蒸日上。但是随之也出现了许多问题&#xff0c;比如&#xff1a;政府单位、企业、个人信息泄露&#xff0c;网络安全问题日益严峻&#xff0c;网络空间安全建设刻不容缓。 网络安全人才需求量巨大&…

双核驱动,合力共进,郁锦香与凯里亚德酒店强强联合释放多元化商业价值

近日&#xff0c;以“清风雅茗 亨嘉之会”为主题的2022锦江酒店&#xff08;中国区&#xff09;厦门站品牌投资品鉴会圆满落幕&#xff0c;众多投资人和酒店品牌方负责人齐聚一堂&#xff0c;在充满文艺气息的滨海城市厦门&#xff0c;感受精致、愉悦的慢生活。在品牌见面环节&…