2 个不稳定版本
0.4.0 | 2023年4月1日 |
---|---|
0.3.0 | 2023年2月12日 |
在 命令行工具 中排名第 2768
63KB
1K 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 REGEX
或 pxh 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)
- pxh将在未来的shell上生效。要为此激活现有会话,请运行
- 导入历史记录
- 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)
- zsh:
- 通过共享存储(如NextCloud、Dropbox、CIFS等)以简单的工作流程定期与来自其他系统的数据库同步
pxh sync ~/Dropbox/pxh/
将合并该目录中的所有数据库文件并写入一个新的文件,其中包含合并后的输出
工作原理
pxh使用SQLite使您的历史记录易于搜索,您可以快速找到有用的命令,甚至是从几年前开始的。SQLite速度快,pxh尝试尽可能高效地使用它。如果pxh给交互式shell添加了明显的延迟,或者搜索简单情况应该瞬间完成,这是不可接受的。
pxh使用shell辅助工具在每次命令之前和之后调用它来记录命令、时间、退出状态以及其他有用的上下文。数据库实时更新,并通过SQLite在多个并发shell之间保持一致性。
默认情况下,数据库文件存储在 ~/.pxh/pxh.db
。您可以使用 cp
命令复制此文件,并用 sqlite3
命令行工具进行检查。
致谢、灵感及类似工具
这个工具最初受到了 bash-history-sqlite 和 zsh-histdb 的启发。这些工具以及类似的工具非常出色,但我发现自己希望将概念进一步扩展。
- 为每个shell构建工具似乎有些多余;pxh 的目的是解决所有shell(以及像
mysql
、python
等跟踪历史记录的类似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