背景
在Bash中,命令历史记录存储在主目录的(.bash_history)文件中。前缀点(.)表示该文件是隐藏文件。要查看它,请发出ls-a命令。
- linuxmi@linuxmi:~$ ls -a
你现在可以像对待其他文本文件一样对.bash_history文件进行操作。
你需要了解的三个相关环境变量是HISTFILE,HISTFILESIZE和HISTSIZE。
HISTFILE—/home/linuxmi/.bash_history
HISTFILESIZE—2000
HISTSIZE—1000
HISTFILE变量保存Bash历史记录文件的名称和位置。HISTFILESIZE是.bash_history文件中可以存储多少个命令。HISTSIZE是缓存的命令数。一旦达到1000条命令,最旧的命令将被丢弃,而新的命令将被保存。
- linuxmi@linuxmi:~$ echo $HISTSIZE
- 1000
- linuxmi@linuxmi:~$ echo $HISTFILESIZE
- 2000
- linuxmi@linuxmi:~$ echo $HISTFILE
- /home/linuxmi/.bash_history
每个用户(包括root用户)都默认分配了这些变量和大小。如果要更改这些变量,请在主目录中编辑.bashrc文件。例如,如果要将大小变量更改为800个命令,请编辑.bashrc文件并使用以下条目:
export HISTSIZE=800
export HISTFILESIZE=800
要使用新值而不用注销及重新登录,执行.bashrc文件命令即可。
- linuxmi@linuxmi:~$ . ~/.bashrc
现在,你的值现在对于当前shell和任何子shell都是激活的。
如果你不想让你的历史记录保留重复的命令,你可以通过添加以下内容到你的.bashrc文件来指示你的历史记录忽略重复的条目:
一个问题
Bash history的问题在于,直到您注销,它才被写入.bash_history文件。这使得不可能使用history命令进行脚本编写。例如,假设您正在班级教学Linux,并且想检查学生是否已运行特定命令以将其文件复制到一个挂载的外部驱动器。如果学生保持登录状态,您将无法确定是否已执行复制,因为您的脚本使用其历史文件(/home/linuxmi/.bash_history)来检查命令是否已经运行。
解决方案
要变通解决此功能,请为history命令使用write选项。作为课堂教学的一部分,即使学生没有注销,您也要让他们运行该命令以保存其历史记录。
- linuxmi@linuxmi:~/www.linuxmi.com$ history -w
现在开始所有当前会话命令历史记录都将写入HISTFILE。现在,您的检查脚本可以轻松找到命令是否已运行。您还必须相信学生会运行历史记录命令。
另一个问题
由于HISTSIZE和HISTFILESIZE相对较大(1000个命令或者2000个命令),因此学生有可能在之前运行过该命令。您可以将export HISTCONTROL=ignoredups条目添加到他们的.bashrc中,但是如果学生几天前运行了类似的命令,这将没有用,因为文件将只显示一个命令。
这个问题的解决方案
要变通解决此问题,你应该在登录后清除学生的历史记录。再次编辑.bashrc文件,并向其中添加以下命令。
history -c
此命令在每次登录时清除其历史记录,并消除了选择以前运行的命令的问题。您不必担心会从以前的会话中拾取命令,因为如果您在/etc/profile中设置了空闲时间限制,则系统会在指定的时间段后注销空闲用户。编辑/etc/profile文件并添加以下条目。
TMOUT=180
TMOUT变量使用几秒钟的空闲时间。在这种情况下,180秒等于3分钟。您可以将此值设置为任何秒数。该值将在所有用户的下次登录时生效。要设置单个超时值,请使用.bashrc,但要知道到用户可以随意更改此文件。
总结
Bash history是一个方便的工具,但是如果您不熟悉它的选项和怪癖,可能会令人沮丧。history中还有更多可用选项。你可以查看手册页以获取更多信息。请记住,你输入的每一个命令都是正在形成的历史记录。