教程

教程

有没有办法可以查看命令行的所有过去的活动/记录,就像浏览器中的“历史记录”功能一样?

背景介绍 我正在使用 OSX 终端与命令行进行交互。

答案1

除非您的系统管理员或您自己进行了$HISTFILE其他设置,否则您的历史记录存储在

~/.bash_history

教程

终端反向搜索

在终端窗口处于活动状态时,按下Control+R,提示reverse-i-search就会出现。现在只需开始输入以前使用的命令的前几个字符 - 整个命令就会显示出来。这对于我们这些记忆力差且命令很长的人来说非常有用。

增加终端历史记录的大小

如果您喜欢终端提醒您以前的命令的想法,那么您可能希望增加终端历史记录文件的大小 - 以获得更多的历史记录存储空间。

如果你有一个 .bash_profile

  1. 在您选择的文本编辑器中打开 .bash_profile

  2. 添加此内容:

    HISTFILESIZE=1000000000 HISTSIZE=1000000

  3. 保存并退出

如果你没有 .bash_profile

  1. 启动终端

  2. 输入以下命令导航到主文件夹:

    cd ~/

  3. 通过输入以下命令创建 .bash_profile:

    touch .bash_profile

  4. 现在,在您最喜欢的文本编辑器中编辑 .bash_profile,或者在终端窗口中键入此内容以在默认的 TextEdit 中自动打开该文件:

    open -e .bash_profile

  5. 最后,将其添加到.bash_profile 文件中:

    HISTFILESIZE=1000000000 HISTSIZE=1000000

  6. 保存并退出

本教程的版权归属于乳状突起

答案2

在许多 shell 中,只需键入 即可查看命令历史记录history

答案3

Bash 有很多选项可以处理您的历史记录。首先,您的历史记录保存在文本文件中。这通常是这样,~/.bash_history但可以通过将$HISTFILE变量设置为其他值来更改。

访问历史记录的最简单方法是

  1. history命令。如果没有选项,它将直接打印您的 的内容$HISTFILE。但是,它有相当多的选项可以操作历史列表。您可以使用 来查看所有选项help history。我发现特别有用的是

    -a  append history lines from this session to the history file
    -r  read the history file and append the contents to the history list
    

    我的 bash 初始化文件中有此行(这是~/bash_profile在 OSX 上以及~/.bashrc对于大多数其他 *nix 版本):

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

    每次我收到新提示时(每次终端显示 时$、首次打开时以及每次运行命令后),都会运行这两个命令。结果是我的历史记录在所有终端窗口之间共享,因为每次运行命令后,都会将该命令写入磁盘$HISTFILE,然后$HISTFILE从磁盘读取。

  2. Up和按钮Down。点击Up一次将显示您运行的上一个命令,再次点击将显示再之前的命令,依此类推。 按钮Down将带您向另一个方向移动。

    在大多数现代系统(例如 OSX)中,此功能已默认启用,但如果未启用,您可以通过将这些行添加到名为的文件来启用此行为~/.inputrc

     "\e[A": history-search-backward
     "\e[B": history-search-forward
    

Bash 还提供了相当多的控制历史行为的选项和变量(其中许多在@Chris 的非常好的答案中提到,我会提到一些他没有提到的):

  • histappend

    If  set,  the history list is appended to the file named by the 
    value of the HISTFILE variable when the shell exits, rather than
    overwriting the file.
    

    同样,这应该是默认设置的。如果您注意到历史记录在终端会话之间不保留,请将此行添加到您的~/.bash_profile

    shopt -s histappend
    
  • 变量HISTCONTROL

    用冒号分隔的值列表,控制如何将命令保存在历史列表中。如果值列表包含 ignorespace,则以空格字符开头的行将不会保存在历史列表中。值为 ignoreups 会导致不保存与前一个历史条目匹配的行。值为 ignoreboth 是 ignorespace 和 ignoreups 的简写。值为 erasedups 会导致在保存当前行之前从历史列表中删除与当前行匹配的所有先前的行。任何不在上述列表中的值都将被忽略。如果 HISTCONTROL 未设置,或者未包含有效值,则 shell 解析器读取的所有行都将保存在历史列表中,但须遵守 HISTIGNORE 的值。多行复合命令的第二行和后续行不经过测试,并且无论 HISTCONTROL 的值如何,都会将其添加到历史记录中。

  • 变量HISTIGNORE

    用冒号分隔的模式列表,用于决定哪些命令行应保存在历史记录列表中。每个模式都固定在行的开头,并且必须与整行匹配(没有隐式的*' is appended). Each pattern is tested against the line after the checks specified by HISTCONTROL are applied. In addition to the normal shell pattern match‐ ing characters,&' 匹配前一个历史记录行。'&' 可以使用反斜杠进行转义;在尝试匹配之前会删除反斜杠。多行复合命令的第二行和后续行不经过测试,并且无论 HISTIGNORE 的值如何,都会添加到历史记录中。

~/.bash_profile把所有这些放在一起,我的 shell 初始化文件(对于 OSX~/.bashrc或大多数其他文件)中有以下几行:

export HISTCONTROL=ignoredups
export HISTSIZE=10000
export HISTIGNORE="pwd:df:du:ls"

## Make Bash append rather than overwrite the history on disk:
shopt -s histappend

## history -a causes the last command to be written to the
## history file automatically and history -r imports the history
export PROMPT_COMMAND='history -a;history -r;'

相关内容