![在 bash 或 zsh 历史中输入我正在处理的文件的绝对路径](https://linux22.com/image/1351914/%E5%9C%A8%20bash%20%E6%88%96%20zsh%20%E5%8E%86%E5%8F%B2%E4%B8%AD%E8%BE%93%E5%85%A5%E6%88%91%E6%AD%A3%E5%9C%A8%E5%A4%84%E7%90%86%E7%9A%84%E6%96%87%E4%BB%B6%E7%9A%84%E7%BB%9D%E5%AF%B9%E8%B7%AF%E5%BE%84.png)
我发现在 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
为仅重写减少数量的命令的历史记录。