【问题标题】: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.
请注意,要准确记录所有内容(包括颜色代码、退格键和其他终端控制序列)非常勤奋,因此您应该小心查看和编辑生成的日志的方式。