【问题标题】:How to capture prompts in stdout/stderr?如何在 stdout/stderr 中捕获提示?
【发布时间】:2016-06-03 21:53:35
【问题描述】:

我正在尝试在日志文件中记录用户的终端会话;相当简单,我为ghci(交互式 Haskell)制作了一个 Python 包装器,如下所示:

#!/usr/bin/env python

import os

cmd = 'ghci 2>&1 | tee hs.log'
os.system(cmd)

但是,这仅捕获打印返回给用户的内容,而不是提示/用户输入的内容。因此,如果会话如下所示:

$ ghci 2>$1 | tee hs.log
GHCi, version 7.10.3: http://www.haskell.org/ghc/  :? for help
Prelude> 1+2
3
Prelude> 3+4
7
Prelude>

hs.log 只有:

$ cat hs.log
GHCi, version 7.10.3: http://www.haskell.org/ghc/  :? for help
3
7

如何在交互式终端会话期间同时捕获输出和输入?

【问题讨论】:

    标签: python unix haskell pipe tee


    【解决方案1】:

    您可以使用script 命令捕获输入和输出。

    cmd = 'script hs.log ghci'
    

    请注意,这会捕获来自终端的所有原始输入和输出。你会看到所有用户的编辑,如果程序是全屏的,你会看到它的所有转义序列来移动光标。有关完整详细信息,请参阅链接文档。

    【讨论】:

    • 请注意,script 记录非规范(原始)用户输入,而不仅仅是标准输入/输出/错误。例如,如果用户犯了一个错误并按下了退格键,那么包括退格符在内的所有内容都会被记录下来。
    • 对,解析起来有点烦人。如果没有script,还有其他方法可以做到这一点吗?我只需要每个换行符或其他任何内容在终端输出每一行。
    • 必须编写自己的位于用户和应用程序之间的程序,因此它会读取用户输入并在将其传送到应用程序之前将其保存。我不知道有什么简单的方法可以做到这一点。
    猜你喜欢
    • 2013-01-12
    • 1970-01-01
    • 2012-02-29
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 2018-10-31
    相关资源
    最近更新 更多