如何保存/记录iex shell的输出以获取持久的命令历史记录?

时间:2014-03-15 16:47:15

标签: shell elixir

我刚刚开始使用Elixir并且一直在使用iex shell。我可以将“会话”保存/记录到文件中吗?

谢谢。

2 个答案:

答案 0 :(得分:40)

在Erlang / OTP-20及更高版本

  

自Erlang / OTP-20rc2以来,Shell历史记录支持开箱即用(尽管最初默认禁用),通过this library端口支持Erlang / OTP代码库。通过将shell_history内核环境变量设置为启用并在环境变量中添加export ERL_AFLAGS="-kernel shell_history enabled"来启用这些版本的shell(请参阅Configuration Options以查看更多选项)。

- https://github.com/ferd/erlang-history

故障排除

历史记录似乎未更新(未写入文件)?

似乎将历史记录写入文件的过程是异步执行的,并且在IEx shell关闭之前需要一些时间来完成它。退出shell之前需要稍等一下(例如按<ctrl+\>)。


Pre Erlang / OTP-20:

我找到了两种方法。

1。 Erlang History

  

erlang-history(eh)是一对小文件,可用于修补Erlang-OTP系统,以便在Erlang中添加历史记录支持   外壳

     

支持的历史记录是通过上/下箭头可用的历史记录   键盘。

在Ubuntu Linux中安装:

sudo su
cd /usr/local/src
git clone https://github.com/ferd/erlang-history.git
cd erlang-history
make install

现在每个基于Erlang的REPL(即IEx)都应该使用erlang-history


2。 rlwrap

作为替代方案,您可以尝试使用更通用的REPL增强器/修复程序rlwrap,这是一个&#34; readline包装器&#34;:

  

...一个小实用程序,它使用GNU readline库来允许   编辑任何命令的键盘输入。

rlwrap -a -A iex -S mix

(如果您使用的是Ubuntu Linux,请使用:sudo apt-get install rlwrap

您可以在REPL中添加更多功能,例如: pipeto过滤器rlwrap -a -z pipeto iex,它允许你将东西传递给shell命令 - 阅读文档非常有用,例如:iex> h Stream | lessmore

了解缺点:

  • 它打破了IEx
  • 中的代码完成(即标签完成)

为什么这个非常有用的功能 - 命令历史记录 - 还没有包含在Elixir / Erlang中?


使用asdf时,请参阅this

答案 1 :(得分:9)

目前不是。你可以写一个小的iex插件来为你做这个。例如,我在~/.iex.exs中有以下文件:

# .iex.exs
defmodule IExHelpers do
  def reload! do
    Mix.Task.reenable "compile.elixir"
    Mix.Task.run "compile.elixir"
  end
end

iex = IExHelpers


# $ iex -S mix
# iex(2)> iex.reload!
# :noop

这将重新编译当前项目并重新加载它,同时仍在使用iex -S mix生成的shell中。您可能会编写一些内容来将当前shell的历史记录保存到文件中,并在启动时将其读回来,但我不确定从哪里开始。