如何将GHCI(命令和命令的结果)输出到bash和文本文件



我想要什么

  • 将我输入GHCI的命令复制到文本文件中
    • 例如:我将一个文件加载到GHCI中,并在文件中运行一个函数。我希望如何运行该函数打印到文本文件中
  • 即使是错误,也要复制命令输入的结果。我还希望命令和结果像正常情况一样显示在shell上。(我用这个和我的教授一起学习,这样我就可以输入他的命令,稍后再学习(
  • 如果我每次在GHCI上运行任何东西时都不必键入一个大命令,我会更喜欢它。所以我只想在加载GHCI时考虑一个txt文件,它会把所有东西都推到那里。我也希望它附加到文本文件而不是覆盖

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

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

如有任何帮助,我们将不胜感激。

这就是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.

请注意,它非常努力地记录所有发生的事情,包括颜色代码、退格和其他终端控制序列,因此您应该小心查看和编辑生成的日志。

这是我通常会使用类似预期的东西来自动化的事情。例如,以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命令还接受一组用于定义自定义交互命令的参数,有关详细信息,请查看链接的手册页。

最新更新