是否有可能拥有目录感知的 bash 历史记录

是否有可能拥有目录感知的 bash 历史记录

我不是唯一一个在某些目录中使用某些命令,而在其他目录中使用不同命令的人。当我进入一个特定的目录并从中运行带有多个参数的脚本时,我希望历史记录能够轻松可用。相反,历史记录被来自不同选项卡和窗口的数百条其他命令所淹没,很难找到我想要重新运行的确切内容。

想象一下,您有一个用于运行非常特定脚本的服务器,该脚本使用大量参数启动-x this -y that/thing/there.conf -d -g -t also -t more- 无论何时您 ssh 到该服务器,要使用该脚本,您只需按几次即可。

那么,有没有办法在一个系统、一个用户下做到这一点?

答案1

首先,将UpDown按钮分别映射到history-search-backward和可能会更简单history-search-forward。来自man bash

   history-search-forward
          Search  forward through the history for the string of characters
          between the start of the current line and the point.  This is  a
          non-incremental search.
   history-search-backward
          Search backward through the history for the string of characters
          between the start of the current line and the point.  This is  a
          non-incremental search.

启用此功能后,如果开始输入命令名称,然后按Up,则只会显示以您输入的内容开头的历史记录中的命令。这样,您可以非常快速地找到您感兴趣的命令,而不必摆弄目录特定的历史记录文件。只需输入s,然后只会找到Up以 开头的命令。使用,只会显示以 开头的命令。sfoobafooba

要启用此功能,请将以下行添加到您的~/.inputrc服务器上的文件中(具体取决于您的终端仿真器,您可能需要稍微不同的格式。看看我的回答这里如果这个不起作用):

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

也就是说,可以为每个目录设置一个历史文件。将此功能添加到您的~/.profile(而不是您的,因为使用此文件登录远程计算机~/.bashrc时默认情况下不会读取此文件):ssh

 setHistFile(){
    targetDirs=("/home/terdon/foo" "/home/terdon/bar")
    for dir in "${targetDirs[@]}"; do
        if [[ "$dir" = "$PWD" ]]; then
            ## Set the history file name
            export HISTFILE="./.bash_history"
            ## clear current history
            history -c
            ## read history from the $HISTFILE
            history -r
            ## Exit the function
            return
        fi
    done
    ## This will be run if the PWD is not in
    ## the targetDirs array
    export HISTFILE="$HOME/.bash_history"
    ## Read the history (in case we are leaving
    ## one of the targetDirs)
    history -r
}

然后将你的PROMPT_COMMAND变量(这是每次显示 shell 提示时执行的命令)设置为它:

export PROMPT_COMMAND='setHistFile'

将数组更改targetDirs为您想要拥有自己的历史文件的目录列表。

答案2

有一个 shell 历史记录扩展,允许您搜索历史记录并根据当前目录、git 存储库、退出状态和主机首先显示相关结果。

您可以在此处安装该项目:https://github.com/curusarn/resh
CTRL使用+ 启动它R(替代反向搜索)。
搜索应用程序如下所示:

搜索应用程序的屏幕截图

免责声明:我是该项目的创建者,这是无耻的自我宣传

答案3

.mycd— 我编写的一个脚本 — 可能正是您想要的。这个想法是为每个目录存储一个 bash 历史文件,该文件仅包含在该目录中执行的命令。一旦以这种方式构建了历史文件,您就可以使用ctrl+r来搜索它们。

相关内容