【问题标题】:How to pull the output of the most recent terminal command?如何拉取最新终端命令的输出?
【发布时间】:2018-08-07 09:16:30
【问题描述】:

我正在构建一个 CLI,它在运行时需要最近执行的 bash 命令的输出。是否可以在不重新计算命令的情况下提取此输出?

例如,假设我运行 python main.py 并收到此错误:

File "main.py", line 41
messages_list.insert(0, { "author" : "dummy_author0", "message" : " " } )
                                                                        ^
IndentationError: unindent does not match any outer indentation level

然后我想运行一个自动提取此错误消息并对其进行处理的命令,而无需重新运行python main.py


我认为运行command1; command2 可以为command2 提供一种方法来提取command1 的输出,因为按顺序执行两者可能被视为一个进程,但我不确定如何.

【问题讨论】:

  • 也许可以尝试使用PROMPT_COMMAND 和错误日志(在每个命令运行时测试错误日志)

标签: bash shell command-line terminal


【解决方案1】:

对于您所说的编译时错误,我认为不会。因为当出现这样的格式问题时,python 文件从一开始就不会运行。我唯一的想法是创建另一个 python 项目,使用 bash 命令运行第一个 python 项目并收集来自 sterror 的输出

如果你想收集运行时错误,你可以尝试将整个东西放在一个 try catch 中并用它做一些事情,例如:

try:
    myfuncode()
except:
    print "Unexpected error:", sys.exc_info()[0]
    #do stuff here

【讨论】:

    【解决方案2】:

    shell(和终端)本身不会为您执行此操作。

    我会将命令包装在一个调用 script 命令的 shell 脚本中,例如,

    • 创建一个临时文件名(取决于系统,但例如使用mktemp),
    • 使用该临时文件作为script 的输出,而不是默认的typescript
    • 在传递给script命令 中,回显退出代码,因为script 将对您隐藏它
    • 在 shell 脚本中,过滤掉回车符等,例如,使用 script2log
    • 过滤输出的最后一行将包含退出代码。将其用于 shell 脚本的退出代码

    对于您的 CLI 程序,让 shell-script 接受一个参数,该参数告诉 shell-script 在哪里写入命令的输出。可能是另一个临时文件,避免了将命令的输出重定向到文件或管道的问题,使输出不再是终端。

    如果您使用的是script 的 Linux 变体,它可能是这样的:

    #!/bin/sh
    # $1 = command
    # $2 = output
    code=0
    tempfile=$(mktemp)
    trap "rm -f \$tempfile; exit \$code" EXIT INT QUIT HUP
    script -q -c "$1; echo \$?" $tempfile
    script2log <$tempfile >$2
    code=$(tail -n 1 $tempfile)
    

    【讨论】:

      猜你喜欢
      • 2013-09-06
      • 1970-01-01
      • 2015-06-13
      • 2013-02-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-20
      • 2019-01-06
      • 1970-01-01
      相关资源
      最近更新 更多