【问题标题】:How to save/log the output of the iex shell to get persistent command history?如何保存/记录 iex shell 的输出以获取持久的命令历史记录?
【发布时间】:2014-04-21 00:37:39
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: shell elixir


    【解决方案1】:

    在 Erlang/OTP-20 及更高版本中

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

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

    疑难解答

    历史好像没有更新(没有写入文件)?

    似乎将历史记录写入文件的进程是异步执行的,并且在关闭 IEx shell 之前需要一些时间来执行此操作。您需要稍等片刻才能退出 shell(例如,按 <ctrl+\>)。


    预 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,它是一个“readline 包装器”:

    ...一个小实用程序,它使用 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 | less (more)

    了解缺点:

    • 它会破坏 IEx 中的代码完成(即制表符完成)

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


    使用asdf 时,请参阅this

    【讨论】:

    • 感谢您对此的研究。在 OSX 上使用 erlang-history 似乎效果很好。
    • 我已经更新了答案以包括在 Erlang/OTP-20 中所做的这个主题的进步。现在更容易让它工作了。
    【解决方案2】:

    目前没有。不过,您可能可以编写一个小的 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 的历史记录保存到文件中,然后在启动时将其读回,但我不确定您将从哪里开始。

    【讨论】:

    • 非常有趣。谢谢。
    • 这与运行r ModuleName 有何不同?是否会重新编译整个应用程序?
    猜你喜欢
    • 2018-01-06
    • 1970-01-01
    • 2019-12-24
    • 2013-05-12
    • 2011-03-11
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多