我想要什么
- 将我输入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
命令还接受一组用于定义自定义交互命令的参数,有关详细信息,请查看链接的手册页。