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

无法在TCL脚本中执行eval/exec,tcl,exec,eval,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_re

我正在使用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的
exec
会抛出错误,原因有二。如果出现以下情况之一,则会这样做:

  • 子流程返回一个非零的退出代码
  • 子进程写入标准错误
  • 第一个问题可能令人恼火,但它确实是程序应该如何指示真正的错误。如果程序还以其他方式使用它(例如,说没有找到任何东西,如
    grep
    所做的),这可能是一个问题。但是,在这种情况下,您会收到错误消息
    子进程异常退出
    ,因此至少可以很容易地找出发生了什么

    更麻烦的是,当某些内容写入标准错误时;写在那里的消息在换行后用作错误消息。即使只是一个换行符也会触发一个失败,而这个失败覆盖了从程序中获得真实信息的任何机会(对于一个换行符来说,这是非常神秘的)。这是(可能)你问题的再现:

    % exec /bin/sh -c {echo >&2} % set errorInfo while executing "exec /bin/sh -c {echo >&2}" 或者,您可以尝试将标准输出和标准错误通道与
    2>@1
    合并,以便错误消息成为整个输出流的一部分(并作为正常结果拾取):

    或者您可以使用合并管道(较旧的Tcl版本需要):

    或者您甚至可以将子流程的标准错误定向到主标准错误:用户(或外部记录器)将看到“错误”输出,但Tcl不会(并且
    exec
    不会失败):

    Tcl 8.6可以实现更复杂的功能,它可以使用
    chan-pipe
    创建操作系统管道,并且(在所有Tcl版本中)可以使用
    open |……
    将子流程作为管道运行,但这可能有些过分



    您不需要
    eval exec{stuff…}
    ;普通的旧
    exec东西…
    完全等效,写起来更短,更容易纠正。

    只是确认:在跟踪的其余部分之前,这是一个空行?当我只使用exec时,以下是脚本和日志:put“\n开始解码捕获文件\n”#source/var/tmp/PCRF/convert#pcap.tcl exec tshark-Vxr/var/tmp/PCRF/create#req.pcap放入“\n文件解码结束,结果为rrr\n”日志:-bash-3.2#tclsh./tcp#u test.tcl开始解码以用户“root”和组“root”身份运行的捕获文件。这可能很危险。执行“exec tshark-Vxr/var/tmp/PCRF/create_req.pcap”(文件“/tcp_test.tcl”第7行)时-bash-3.2# % exec /bin/sh -c {echo >&2} % set errorInfo while executing "exec /bin/sh -c {echo >&2}"
    exec -ignorestderr tshark -Vxr /var/tmp/PCRF/create_req.pcap
    
    exec tshark -Vxr /var/tmp/PCRF/create_req.pcap 2>@1
    
    exec tshark -Vxr /var/tmp/PCRF/create_req.pcap |& cat
    
    exec tshark -Vxr /var/tmp/PCRF/create_req.pcap 2>@stderr