还记得文件夹中的“本地” bash历史记录吗?


11

我在使用长参数的文件夹中有一个脚本。我有没有可能拥有在该特定目录中执行的命令的历史记录,而不必回顾整个历史记录?


3
有趣的问题。顺便说一句,您可以使用Ctrl + R来搜索它,而不是“遍历整个历史”,这就是我在这种情况下要做的。
phk

是的,它有帮助,但是这样我只有最后一个。是否有可能有多个结果?
faber

1
输入命令名称的一部分后,可以继续按Ctrl + R。
mtahmed '16

history | less也许?它并不能真正回答您的问题,但这就是我要开始的地方。
roaima

@roaima然后使用“ /” + 搜索词 + Enter 搜索,然后使用“ n” /“ N”进行进一步的向前/向后搜索。
phk 16-10-26

Answers:


2

通过连接到bash的PROMPT_COMMAND,此函数在每次收到新提示时都将运行,因此现在是检查您是否要在其中创建自定义历史记录的目录中的好时机。该功能有四个主要分支:

  1. 如果当前目录($PWD)没有更改,则什么也不做(返回)。

如果PWD 更改,则我们将设置一个本地函数,其唯一目的是将“自定义目录”代码分解为一个地方。您将要用自己的测试目录替换我的测试目录(以分隔|)。

  1. 如果我们尚未更改自定义目录,则只需更新“上一个目录”变量并返回该函数即可。

由于我们已经更改了目录,因此请更新“上一个目录”变量,然后将内存中的历史记录保存到HISTFILE中,然后清除内存中的历史记录。

  1. 如果我们已更改自定义目录,则将HISTFILE设置.bash_history为当前目录中的文件。

  2. 否则,我们已更改自定义目录,因此将HISTFILE重置为原始目录。

最后,由于我们更改了历史记录文件,因此请回读以前的历史记录。

为了使事情顺利进行,该脚本设置了PROMPT_COMMAND值并保存了两个内部使用的变量(库存HISTFILE和“先前目录”)。

prompt_command() {
  # if PWD has not changed, just return
  [[ $PWD == $_cust_hist_opwd ]] && return

  function iscustom {
    # returns 'true' if the passed argument is a custom-history directory
    case "$1" in
      ( */tmp/faber/somedir | */tmp/faber/someotherdir ) return 0;;
      ( * ) return 1;;
    esac
  }

  # PWD changed, but it's not to or from a custom-history directory,
  # so update opwd and return
  if ! iscustom "$PWD" && ! iscustom "$_cust_hist_opwd"
  then
    _cust_hist_opwd=$PWD
    return
  fi

  # we've changed directories to and/or from a custom-history directory

  # save the new PWD
  _cust_hist_opwd=$PWD

  # save and then clear the old history
  history -a
  history -c

  # if we've changed into or out of a custom directory, set or reset HISTFILE appropriately
  if iscustom "$PWD"
  then
    HISTFILE=$PWD/.bash_history
  else
    HISTFILE=$_cust_hist_stock_histfile
  fi

  # pull back in the previous history
  history -r
}

PROMPT_COMMAND='prompt_command'
_cust_hist_stock_histfile=$HISTFILE
_cust_hist_opwd=$PWD

0

如果您只需要单个目录的历史记录,Jeff的答案很好,但是如果您确定安装zsh可以,则可以使用per-history-directory获取特定于所有目录的目录的历史记录。

您可以通过以下方式安装zsh:

brew install zsh

另外,如果你想安装哦,我-zsh中,您可以添加在histdb插件并编写自定义查询,查询的SQLite数据库是histdb在增加。我写了那篇关于并且在添加自动完成功能开发日记后。检查奖励命令部分。

查询看起来像这样

show_local_history() {
    limit="${1:-10}"
    local query="
        select history.start_time, commands.argv 
        from history left join commands on history.command_id = commands.rowid
        left join places on history.place_id = places.rowid
        where places.dir LIKE '$(sql_escape $PWD)%'
        order by history.start_time desc
        limit $limit
    "
    results=$(_histdb_query "$query")
    echo "$results"
}

这也接受一个可选的限制:

show_local_history 50

例如。


-1

当我需要多次使用带有长参数的命令时,通常会在自己的别名中创建一个别名,~/.bash_aliases也可以根据需要将其放入您的别名中~/.bashrc。这很容易,可以节省时间,而无需在历史记录中查找旧命令。


1
这是一个很好的提示,但不是OP想要的。OP对于他/她正在寻找的内容非常具体(顺便说一句,我也要注册一个解决方案)。
phk

@phk是的,下次我会更加小心!感谢您的解释!
andreatsh '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.