当前位置: 首页 > 科技观察

善用bashhistory命令

时间:2023-03-15 17:06:48 科技观察

相信大家平时都会使用history命令来查看命令历史,但实际上history命令并不是唯一的功能,history还有很多有用的功能。特别是历史命令的Bash版本,它提供了比所有其他Linuxshell历史命令更多的功能。Bash历史悠久,是一个古老的shell,它还有一个更古老的前身,即BourneShell(sh)。因此,Bash的历史命令是所有LinuxShell历史命令中功能最丰富的。bash版的history命令不仅支持反向搜索、快速调用,还支持重写历史等等。善用bashhistory命令的上述功能,可以提高你的工作效率,那么让良旭为你一一讲解bashhistory命令及其常用功能。history是内置命令history命令与许多其他命令不同。您可能习惯于将命令作为可执行文件放置在常见的系统级位置,例如/usr/bin、/usr/local/bin或~/bin。但是内置的history命令并不在你的环境变量PATH中保存的路径中。其实history命令并没有保存在物理位置:$whichhistorywhich:nohistoryin[PATH]history其实是shell本身的一个内置函数:$typehistoryhistoryisashellbuiltin$helphistoryhistory:history[-c][-doffset][n]orhistory-anrw[filename]或history-psarg[arg...]Displayormanipulatethehistorylist.[...]由于history是shell的内置函数,所以每个shell的history函数都是独一无二的。因此,在Bash中有效的方法在Tcsh、Fish或Dash中可能无效,同样,在Tcsh、Fish或Dash中有效的方法在Bash中可能无效。查看你的Bash命令历史最基本和最常用的命令是查看你的shell会话的命令历史:$echo"hello"hello$echo"world"world$history1echo"hello"2echo"world"3historyeventPromptTheevent提示符(!)按事件搜索历史记录。这里的事件指的是历史上记录的每一个命令。换句话说,它是一个命令行,标有数字索引以供参考。要重新运行历史记录中的命令,请使用!后跟(无空格)要运行的命令之前的索引号。例如,假设历史中的第一条指令是echohello,你想重新运行它:$!1echo"hello"hello你也可以通过提供从当前位置开始的带有负数的行来使用相对定位在历史上。例如,要返回历史中倒数第三条命令:$echo"alvin"alvin$echo"hello"hello$echo"world"world$!-3echo"alvin"alvin如果你只想返回上一个命令,你可以使用速记!替换!-1。这节省了整个击键!!!$echo"alvin"alvin$!!echo"alvin"alvinstringsearch您还可以通过特定字符串在历史记录中搜索命令并运行它。如果要搜索以特定字符串开头的命令,请使用!直接添加(不带空格)要搜索的字符串:$echo"alvin"alvin$true$false$!echoecho"alvin"alvin您还可以在任何地方搜索包含特定字符串的命令。为此,您只需要使用!直接添加由?包围的特定字符串在两端,像这样:$echo"alvin"alvin$true$false$!?alvin?echo"alvin"alvin如果你知道你要搜索的字符串在命令的末尾,你可以省略?在字符串之后,像这样:$echoalvinalvin$!?alvinechoalvinalvin值得注意的是,如果history包含目标字符串,如果有多个命令,它只会执行最后一个符合条件的命令:$echo"helloworld"helloworld$echo"helloalvin"helloalvin$!?hello?echo"helloalvin"helloalvin字符串替换您可以搜索特定的字符串并用新字符串替换它,从而改变命令:$echo"hello"hello$echo"world"world$^hello^alvinecho"alvin"alvin但是它只能替换第一次出现的目标字符串,如果在命令中如果目标字符串出现两次,那么只会替换第一次出现的,像这样:$echo"hellohello"hellohello$^hello^alvinecho"alvinhello"alvinhello和字符串搜索一样,当历史记录中包含目标字符串时当有多条命令时,只替换执行最后一条:$echo"helloworld"helloworld$echo"hello"你好$^你好^alvinecho"alvin"alvin填满history命令的使用事实上,Bash的history命令的功能远不止这篇文章提到的,但这是一个很好的开始,让你习惯使用history命令,而不是仅仅使用history来查看历史记录。经常使用history命令,您会惊讶于仅使用history命令而无需键入特定命令就可以完成如此??多的工作。本文经授权转载自公众号“良墟Linux”。世界500强外企Linux开发工程师梁旭,在公众号分享大量Linux干货,欢迎关注!