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

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

我在一个文件夹中有一个脚本,我使用长参数。我是否有机会获得在该特定目录中执行的命令的历史记录,而不是返回整个历史记录?

答案1

通过挂钩 bash 的 PROMPT_COMMAND,每次收到新提示时都会运行此函数,因此这是检查您是否位于想要自定义历史记录的目录中的好时机。该函数有四个主要分支:

  1. 如果当前目录 ( $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

答案2

杰夫的回答如果您想要单个目录的历史记录,但如果您同意安装,那就太棒了桀骜你可以用每个历史目录获取特定于该目录的所有目录的历史记录。

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

brew install zsh

或者,如果您想安装哦我的zsh,您可以添加历史数据库插件并编写一个自定义查询来查询 histdb 添加的 sqlite 数据库。我写了相关内容并在开发日记邮政。检查奖励命令部分。

查询看起来像这样

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

例如。

答案3

当我需要多次使用带有长参数的命令时,我通常会在 my 中创建一个别名,或者如果您愿意,~/.bash_aliases也可以将其放入 your 中。~/.bashrc这很简单并且节省时间,而不是寻找历史中的旧命令。

相关内容