【问题标题】:How do I output GHCI (commands and result of the commands) to the bash and a text file?如何将 GHCI(命令和命令的结果)输出到 bash 和文本文件?
【发布时间】:2021-06-15 01:56:58
【问题描述】:

我想要什么

  • 将我输入到 GHCI 中的命令复制到一个文本文件中
    • 例如:我将一个文件加载到 GHCI 中并在文件中运行一个函数 我想如何运行该函数以打印到文本文件中
  • 复制命令输入的结果,即使它是错误的。我还希望命令和结果像往常一样显示在 shell 上。 (我用它来跟随我的教授,这样我就可以输入他的命令并在以后研究它们)
  • 如果我在 GHCI 上运行任何东西时不必每次都键入大命令,我会更喜欢它。因此,我只想加载带有 txt 文件的 GHCI,它会将所有内容推送到那里。我还希望它附加到文本文件而不被覆盖。

到目前为止我发现了什么。 . .

  • 使用 ghci file.hs |& tee -a file.txt 加载 ghci 有效,但它不打印我只输入结果的命令(包括错误)
  • 在 ~/.ghc/ghci_history 中有一个 ghci 历史记录,它将我输入到 GHCI 的下一个命令附加到文件的顶部(第一行),但不包括命令的结果
  • bash 历史记录不包括我输入的 GHCI 命令。它保存的最后一件事是我最初加载到 GHCI 时

感谢任何帮助。

【问题讨论】:

标签: ubuntu haskell sh ghc


【解决方案1】:

这是我通常会使用 expect 之类的东西来自动化的事情。例如,以这个 Expect 脚本为例:

spawn {*}[lrange $argv 0 end]
log_file ghci.log
interact

我可以像这样运行 GHCi:

expect ghci.expect stack ghci

第一行有点多余,但这提供了一个示例,说明如何将范围更改为例如lrange $argv 1 end 跳过第一个参数并将其用于其他内容,例如日志文件名:

spawn {*}[lrange $argv 1 end]
log_file [lindex $argv 0]
interact

像这样调用:

expect ghci.expect ghci.log stack ghci

无论哪种方式,默认附加的日志文件ghci.log(使用log_file -noappend 覆盖)将包含我的整个交互:键盘输入、标准输出和标准错误。我可以使用less -R ghci.log查看日志文件; -R 是通过 ANSI 控制代码进行颜色输出和行编辑(退格、箭头等)所必需的。

这足以复制部分交互,但日志文件本身会相当混乱,因为它基本上是在键级别记录,所以如果你想去除控制代码,可能需要进一步处理。 interact 命令还接受用于定义自定义交互命令的参数块,请查看链接的手册页以获取更多信息。

【讨论】:

    【解决方案2】:

    这就是script 命令的用途。你可以这样使用它:

    % script -a ghci.log -c ghci
    Script started, output log file is 'ghci.log'.
    GHCi, version 8.10.4: https://www.haskell.org/ghc/  :? for help
    Prelude> "lul"
    "lul"
    Prelude> :q
    Leaving GHCi.
    % cat ghci.log
    Script started on 2021-03-17 20:28:31-04:00 [TERM="rxvt-unicode-256color" TTY="/dev/pts/8" COLUMNS="106" LINES="56"]
    GHCi, version 8.10.4: https://www.haskell.org/ghc/  :? for help
    Prelude> "lul"
    "lul"
    Prelude> :q
    Leaving GHCi.
    

    请注意,要准确记录所有内容(包括颜色代码、退格键和其他终端控制序列)非常勤奋,因此您应该小心查看和编辑生成的日志的方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-13
      • 1970-01-01
      • 2011-04-17
      • 2021-02-26
      • 1970-01-01
      • 2010-11-03
      相关资源
      最近更新 更多