我正在使用TCL来控制流量生成器。当收到流量时,我想使用shark命令将.pcap文件转换为.txt文件,然后我可以做其他工作。
但是当在程序中运行exec时,打印出以下信息:
while executing "exec tshark -Vxr /var/tmp/PCRF/create_req.pcap" ("eval" body line 1) invoked from within "eval exec {tshark -Vxr /var/tmp/PCRF/create_req.pcap}" (file "./tcp_test.tcl" line 7)
以下是TCL脚本:
# Radius accounting request start packets
# Version 1.0
# Date 2014/4/16 16:38
puts "\n Begin to decode the capture file\n"
#source /var/tmp/PCRF/convert_pcap.tcl
eval exec {tshark -Vxr /var/tmp/PCRF/create_req.pcap}
puts "\n end of the file decode and the result is rrr\n"
答案 0 :(得分:0)
Tcl的exec
可能会因两个原因而抛出错误。如果 :
第一个可能很烦人,但它确实是程序如何表示真正的错误。如果程序也以其他方式使用它(例如,没有找到任何内容,如grep
那样),那么这可能是一个问题。但是,在这种情况下,您会收到错误消息child process exited abnormally
,因此很容易弄清楚发生了什么。
更有问题的是什么时候写入标准错误;写入的消息在换行摘录后用作错误消息。即使只是换行也会触发失败,并且失败会覆盖从程序中获取真实内容的任何机会(在新行的情况下,这是非常神秘的)。这是(可能)复制你的问题:
% exec /bin/sh -c {echo >&2} % set errorInfo while executing "exec /bin/sh -c {echo >&2}"
如何解决这个问题?那么,您可以尝试-ignorestderr
选项(如果您的Tcl版本支持,您没有提及):
exec -ignorestderr tshark -Vxr /var/tmp/PCRF/create_req.pcap
或者您可以尝试将标准输出和标准错误通道与2>@1
合并,以便错误消息是整个输出流的一部分(并作为正常结果选取):
exec tshark -Vxr /var/tmp/PCRF/create_req.pcap 2>@1
或者你可以使用合并管道(旧的Tcl版本需要):
exec tshark -Vxr /var/tmp/PCRF/create_req.pcap |& cat
或者您甚至可以将子流程的标准错误指向主标准错误:用户(或外部记录器)将看到“错误”输出,但Tcl不会(并且exec
不会失败):
exec tshark -Vxr /var/tmp/PCRF/create_req.pcap 2>@stderr
使用Tcl 8.6可以做更精细的事情,它可以使用chan pipe
的OS管道,你可以(在所有Tcl版本中)使用open |…
作为管道运行子进程,但这些可能是过度的。 / p>
您不需要eval exec {stuff…}
;普通的旧exec stuff…
是完全等价的,写得更短,更容易纠正。