如何拉出最新的终端命令的输出?

时间:2018-02-27 16:32:09

标签: bash shell command-line terminal

我正在构建一个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的输出,因为顺序执行可能会被视为单个进程,但是我不确定如何。

2 个答案:

答案 0 :(得分:1)

shell(和终端)本身不会为你做这件事。

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

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

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

如果你使用的是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)

答案 1 :(得分:0)

对于编译时错误,就像你说的那样,我会假设没有。因为当存在格式化问题时,python文件永远不会首先运行。我唯一的想法是创建另一个python项目,使用bash命令运行第一个python项目并收集来自sterror的输出

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

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