在 bash 或 zsh 历史中输入我正在处理的文件的绝对路径

在 bash 或 zsh 历史中输入我正在处理的文件的绝对路径

我发现在 bash 中我经常使用类似这样的内容:

  • vim ./somefile1 更少
  • 少./dir1/dir2/somefile2
  • cp 某些其他文件的相对路径

等等

之后,当我尝试在历史记录中查找命令并运行它时,我收到错误,因为我现在处于不同的目录中。是否可以配置 bash 以在文件进入历史记录时使用绝对路径“扩展”文件的相对路径?

答案1

一个解决方案是重写历史记录,以便当您运行此命令时:

ls

它被保存为:

cd /current/directory && ls

对于 Bash,有一个修改其历史记录的技巧,如这篇精彩文章中所述stackoverflow 答案。您需要使用名为 的 Bash shell 变量PROMPT_COMMAND

设置后,每次在显示提示之前都会执行其内容。将其设置为:

export PROMPT_COMMAND='hcmd=$(history 1); hcmd="${hcmd# *[0-9]*  }"; if [[ ${hcmd%% *} == "cd" ]]; then pwd=$OLDPWD; else pwd=$PWD; fi; hcmd=$(echo -e "cd $pwd && $hcmd"); history -s "$hcmd"'

将如上所述改写历史。

首先在终端窗口中尝试它,如果您满意,请将其添加到您的.bashrc文件中以启用它。

缺点是,就其目前的版本而言,全部命令将以 为前缀 cd /some/dir,这会降低可读性,并且对于如下命令可能会很烦人cd /usr/local

$ history | tail -n 5
  522  cd /Users/jaume && cd /usr/local
  523  cd /usr/local && file bin/ls
  524  cd /usr/local && cd ~
  525  cd /Users/jaume && file Documents/.localized 
  526  history | tail -n 5

当然,您可以修改PROMPT_COMMAND为仅重写减少数量的命令的历史记录。

相关内容