无法在TCL脚本中执行eval/exec
我正在使用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脚本中执行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的
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