eval / exec无法在TCL脚本中执行

时间:2014-06-11 07:49:25

标签: tcl exec eval

我正在使用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"

1 个答案:

答案 0 :(得分:0)

Tcl的exec可能会因两个原因而抛出错误。如果

,则会这样做
  1. 子进程返回非零退出代码。
  2. 子进程写入标准错误。
  3. 第一个可能很烦人,但它确实是程序如何表示真正的错误。如果程序也以其他方式使用它(例如,没有找到任何内容,如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…是完全等价的,写得更短,更容易纠正。