【问题标题】:How to search `iex` or `erl` shell history?如何搜索 `iex` 或 `erl` shell 历史记录?
【发布时间】:2019-12-24 00:56:12
【问题描述】:
我可以使用相应的箭头键上下移动历史记录,但是对于大型历史记录来说这很麻烦,而且CTRL-R 似乎不起作用。
查看了Erlang's shell module 和Elixir's IEx module 文档,但他们没有提及任何关于此的内容。后者至少告诉how to enable it:
可以通过传递一些选项来获取 shell 历史记录
在虚拟机中启用它。这可以在每个需要的基础上完成
开始IEx:
iex --erl "-kernel shell_history enabled"
如果您希望在整个系统上启用它,您可以使用
ERL_AFLAGS 环境变量并确保已设置
相应地在您的终端/外壳配置上。
在类 Unix / Bash 上:
export ERL_AFLAGS="-kernel shell_history enabled"
在 Windows 上:
set ERL_AFLAGS "-kernel shell_history enabled"
在 Windows 10 / PowerShell 上:
$env:ERL_AFLAGS = "-kernel shell_history enabled"
【问题讨论】:
标签:
erlang-shell
elixir-iex
【解决方案1】:
引用Erlang patches mailing list中所说的话
可以通过按 ctrl-r 进入搜索模式。输入条款并按
再次按 ctrl-r 向后搜索,或按 ctrl-s 然后向前搜索(如果
你的终端不会吃掉那个)。
值得注意的是,OP 提到 ctrl-r 不起作用,并且链接的消息对 Windows 环境也有同样的说法。根据环境的不同,此功能似乎有一些注意事项。
很难详细说明 OP 的情况,但 FWIW,该功能确实按照 macOS 10.14、iTerm2 和 Elixir 1.10.4-otp-22 中的描述工作。
【解决方案2】:
快速而肮脏的解决方案:
-
由于可以通过 Erlang 的 kernel 标志启用历史记录,因此在 the kernel docs 中找到了以下标志:
shell_history = enabled | disabled
指定是否 shell 历史
应该在使用 erl 之间记录到磁盘。
shell_history_drop = [string()]
不应该的特定日志行
被坚持。例如["q().", "init:stop()."] 将允许
忽略关闭节点的命令。默认为[]。
shell_history_file_bytes = integer()
shell 有多少字节
应该记住。默认情况下,该值设置为 512kb,并且
最小值为 50kb。
shell_history_path = string()
指定 shell 历史记录的位置
文件将被存储。默认为用户的缓存目录
由filename:basedir(user_cache, "erlang-history")返回。
-
在iex中查找shell历史文件的路径
iex(27)> :filename.basedir(:user_cache, "erlang-history")
"/home/user/.cache/erlang-history"
-
在系统外壳中使用less
$ ll /home/user/.cache/erlang-history/
total 100
drwxr-xr-x 2 user users 4096 Aug 18 07:59 ./
drwxr-xr-x 14 user users 4096 Aug 2 15:52 ../
-rw-r--r-- 1 user users 52415 Aug 10 08:13 erlang-shell-log.1
-rw-r--r-- 1 user users 29992 Aug 18 08:00 erlang-shell-log.2
-rw-r--r-- 1 user users 26 Aug 18 07:59 erlang-shell-log.idx
-rw-r--r-- 1 user users 13 Aug 18 07:59 erlang-shell-log.siz
$ less /home/user/.cache/erlang-history/erlang-shell-log.1
"/home/user/.cache/erlang-history/erlang-shell-log.1" may be a binary file.
See it anyway?
# Hit y
我确定有更复杂的方法,但没有时间探索它们,也找不到任何可以专门从iex(或erl)查询历史的项目)。