#shell-history #shell #history #command-line #command-line-tool #search #line-search

程序+库 pxh

pxh 是一个快速、灵活的 shell 历史挖掘工具。它索引你的所有 shell 历史,让你能够全面回忆起你知识库中最宝贵的资源之一——你的 shell 历史。

2 个不稳定版本

0.4.0 2023年4月1日
0.3.0 2023年2月12日

命令行工具 中排名第 2768

MIT 许可证

63KB
1K SLoC

Rust 874 SLoC // 0.1% comments Shell 179 SLoC // 0.4% comments Zsh 40 SLoC BASH 35 SLoC SQL 22 SLoC

pxh

适用于交互式 shell 和其他 REPL 工具的便携式、可扩展的历史管理器(简称 pxh)。

pxh 的任务是成为一个可靠且不引人注目的持久性和搜索引擎,用于跟踪你拥有的最有价值的知识库之一——你的 shell 历史。 pxh 可以导入你的现有历史文件,让你有一个良好的开端,并提供跨计算机的一致性、按需同步。

主要功能

  • pxh快速且不引人注目;一旦安装,除非你想进行搜索,否则你几乎不会注意到它。
  • pxh 使用额外的上下文(如目录、主机和用户)对历史命令进行标记,这让你可以存储 所有 历史记录,而不仅仅是主机的。它还跟踪退出码和持续时间。
  • pxh 支持灵活的搜索,可以快速找到相关且有用的条目,例如在特定目录中运行的所有命令或给定 shell 会话中发出的命令。
  • pxh 提供跨计算机的 简单、按需同步,以允许查看“最终一致”的全局交互式 shell 历史视图。

快速链接

目前 pxh 支持 bash 和 zsh。

基本用法

pxh 的工作流程涉及搜索历史记录。 pxh 力求提供比 history | grep SOME_COMMAND 更好的性能和人体工程学,同时确保永远不会错过任何历史记录。要搜索历史记录,请使用 pxh show REGEXpxh s REGEX

用例:记住复杂的命令

ffmpeg 是一个很好的工具,但我从未完全记住如何使用它。幸运的是,我的 shell 历史记录做了这件事。

$ pxh s ffmpeg
...
 2022-06-04 07:54:04  ffmpeg -encoders | grep '^ V'
 2022-06-07 23:17:33  ffmpeg -y -r 30 -f concat -safe 0 -i <(sed 's/^/file /' /tmp/files) -c:v libx264rgb -preset veryslow -crf 21 -vf fps=30 /tmp/combined.mp4
 2022-08-03 10:39:11  ffmpeg -i cropped.mp4 -vf "pad=width=430:height=430:x=215:y=0:color=black" cropped.gif
...

用例:查看 pxh 可以简化的历史记录搜索示例

由于 pxh 是为了简化历史记录搜索而创建的,如果你倾向于执行一系列 history | grep ...,则将这些解决方案映射到 pxh 调用可能很有用。

$ pxh s -v history grep
 Start                Command
 2011-08-24 14:51:48  history | grep port | grep install
 2012-11-04 09:52:24  history | tail -50 | grep rm
 2013-02-02 23:45:06  history | grep ec2-descr
 2013-03-27 17:00:42  history | grep qemu
 2020-04-02 10:12:52  history | grep gphotos-sync | grep pip
 2021-03-29 09:14:34  history | grep squashfuse | grep -i release

用例:探索项目相关的历史记录命令

由于pxh跟踪您执行的命令所在的目录,并且由于目录通常是一点本地上下文(即您在开源项目上工作时),按目录过滤有时可能很有用。例如,在pxh上运行时执行的命令

$ pxh s --here
 Start                Command
 2023-02-06 22:43:16  cargo test
 2023-02-06 22:43:21  cargo build --release
 2023-02-06 22:43:25  pxh sync ~/Dropbox/pxh/
 2023-02-06 22:44:28  git diff
 2023-02-06 22:44:36  cargo clippy
 2023-02-06 22:44:42  git commit -a -m 'clippy fixes'
 2023-02-06 22:44:44  git push
 ...

用例:查看更多详细信息,例如执行时间

您可以使用-v标志查看更多详细信息,例如主机、目录、持续时间以及退出代码

$ pxh s -v cargo build
 Start                Duration  Session       Context                                           Command
...
 2023-02-06 22:10:20  1s        116ef63fc226  .                                                 cargo build --release
 2023-02-06 22:28:00  2s        116ef63fc226  .                                                 cargo build --release
 2023-02-07 05:50:02  0s        ee6e1989f3da  /home/chip                                        cargo build --release
 2023-02-07 06:32:04  37s       ee6e1989f3da  .                                                 cargo build --release
...

pxh在给定多个搜索过滤器时执行直观的操作:它按顺序逐个找到匹配每个过滤器的结果(基本上通过将提供的模式与.*\s.*连接来创建正则表达式,这有点难以输入)

$ pxh s git pull
 Start                Command
...
 2023-01-31 11:11:36  git pull --rebase
 2023-02-03 08:18:34  fd -t d -d 1 -x git -C {} pull --rebase
 2023-02-03 10:44:02  git pull --rebase
 ...

用例:跨计算机同步

最后,跨时间和空间共享历史记录很容易。使用像Dropbox或CIFS这样的共享存储系统是最简单的,但您rsync的目录也可以工作。在每台计算机上,只需运行pxh sync $DIR

第一台计算机(nomad

$ pxh sync ~/Dropbox/pxh/
Syncing from /home/chip/Dropbox/pxh/homebase.db...done, considered 314181 rows and added 5
Saved merged database to /home/chip/Dropbox/pxh/nomad.db

第二台计算机(homebase

$ pxh sync ~/Dropbox/pxh/
Syncing from /Users/chip/Dropbox/pxh/nomad.db...done, considered 314236 rows and added 55
Saved merged database to /Users/chip/Dropbox/pxh/homebase.db

注意,这也可以用作备份方法(例如,在pxh数据库文件上使用cp)。

更高级的用法和标志可以通过pxh help探索。

入门指南

  • 安装bxh二进制文件
  • 安装pxh shell辅助工具:pxh install YOUR_SHELL_NAME(例如zsh)。
    • pxh将在未来的shell上生效。要为此激活现有会话,请运行source <(pxh shell-config YOUR_SHELLNAME)
  • 导入历史记录
    • zsh:pxh import --shellname zsh --histfile ~/.zsh_histfile
    • bash:pxh import --shellname bash --histfile ~/.bash_history
    • 可选:从另一台计算机拉取:pxh import --shellname zsh --hostname HOST --username root --histfile <(ssh root@HOST cat /root/.zsh_histfile)
  • 通过共享存储(如NextCloud、Dropbox、CIFS等)以简单的工作流程定期与来自其他系统的数据库同步
    • pxh sync ~/Dropbox/pxh/将合并该目录中的所有数据库文件并写入一个新的文件,其中包含合并后的输出

工作原理

pxh使用SQLite使您的历史记录易于搜索,您可以快速找到有用的命令,甚至是从几年前开始的。SQLite速度快,pxh尝试尽可能高效地使用它。如果pxh给交互式shell添加了明显的延迟,或者搜索简单情况应该瞬间完成,这是不可接受的。

pxh使用shell辅助工具在每次命令之前和之后调用它来记录命令、时间、退出状态以及其他有用的上下文。数据库实时更新,并通过SQLite在多个并发shell之间保持一致性。

默认情况下,数据库文件存储在 ~/.pxh/pxh.db。您可以使用 cp 命令复制此文件,并用 sqlite3 命令行工具进行检查。

致谢、灵感及类似工具

这个工具最初受到了 bash-history-sqlitezsh-histdb 的启发。这些工具以及类似的工具非常出色,但我发现自己希望将概念进一步扩展。

  • 为每个shell构建工具似乎有些多余;pxh 的目的是解决所有shell(以及像 mysqlpython 等跟踪历史记录的类似shell环境)的问题。
  • 这些工具依赖于shell调用sqlite CLI。这工作...直到它不起作用。它需要精确的引号,而且不幸的是,当shell在接近的位置启动时,它容易发生竞态条件。
  • 我希望有一个效率高且易于扩展的工具。通过使用原生语言如Rust,每个命令调用的开销非常小,并且更容易构建可移植、性能良好的复杂工具,如TUI、复杂搜索、分析等。

此工具嵌入非常有用的 Bash-Preexec 工具,它为Bash提供了非常类似zsh的扩展,用于跟踪命令的开始和结束。

待办事项 / 灵感

可用性 / UX

  • P1:将列名作为 show 选项暴露出来,以控制输出字段和顺序
  • P2:对输出进行着色?除了列之外,还有与正则表达式匹配的部分
  • P3:在显示shell历史记录时特别处理ctrl-z...令人烦恼,需要信号号,找到一个crate?
  • P3:可选的ncurses风格的界面?

核心功能

  • P1:向 show 添加更多复杂的过滤,以选择受限于主机、用户等的历史记录条目
  • P3:stats子命令以显示一些有趣的数据

扩展

  • P2:更多shell支持
    • P2:然后是非shell,如mysql、python、gdb、sqlite_history ...
  • P3:探索使用 pxh 进行交互式shell增量历史搜索
  • P3:创建和记录增量更新的工作流程,特别是对于不支持实时更新的shell(例如,定期从mysql历史记录中回填)

其他

  • P2:更好的代码文档,尤其是关于辅助类
  • P2:记录架构和实现细节
  • P3:某种方式来删除历史文件中意外输入的密码,而无需求助于sqlite?以及以某种方式防止重新导入?

依赖

~31–47MB
~717K SLoC