我不是唯一一个在某些目录中使用某些命令,而在其他目录中使用不同命令的人。当我进入一个特定的目录并从中运行带有多个参数的脚本时,我希望历史记录能够轻松可用。相反,历史记录被来自不同选项卡和窗口的数百条其他命令所淹没,很难找到我想要重新运行的确切内容。
想象一下,您有一个用于运行非常特定脚本的服务器,该脚本使用大量参数启动-x this -y that/thing/there.conf -d -g -t also -t more
- 无论何时您 ssh 到该服务器,要使用该脚本,您只需按几次即可。
那么,有没有办法在一个系统、一个用户下做到这一点?
答案1
首先,将Up和Down按钮分别映射到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以 开头的命令。使用,只会显示以 开头的命令。s
fooba
fooba
要启用此功能,请将以下行添加到您的~/.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来搜索它们。