我正在构建一个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
的输出,因为顺序执行可能会被视为单个进程,但是我不确定如何。
答案 0 :(得分:1)
shell(和终端)本身不会为你做这件事。
我将命令包装在调用script
命令的shell脚本中,例如,
mktemp
),script
的输出,而不是默认的typescript
。script
的命令中的script
将隐藏该代码script2log
和对于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