【问题标题】:eval/exec can not be executed in TCL scripteval/exec 不能在 TCL 脚本中执行
【发布时间】:2014-06-11 07:49:24
【问题描述】:

我正在使用 TCL 来控制流量生成器。收到流量后,我想使用shark命令将.pcap文件转换为.txt文件,然后我可以做一些其他的工作。

但是在程序中运行 exec 时会打印出以下信息:

在执行时 “执行 tshark -Vxr /var/tmp/PCRF/create_req.pcap” (“eval”正文第 1 行) 从内部调用 “eval exec {tshark -Vxr /var/tmp/PCRF/create_req.pcap}” (文件“./tcp_test.tcl”第 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"

【问题讨论】:

  • 只是确认一下:在其余的跟踪之前先是一个空行?
  • 当我只使用exec时,以下是脚本和日志: puts "\n Begin to decode the capture file\n" #source /var/tmp/PCRF/convert_pcap.tcl exec tshark - Vxr /var/tmp/PCRF/create_req.pcap puts "\n end of the file decode and the result is rrr\n" 日志: -bash-3.2# tclsh ./tcp_test.tcl 开始解码捕获文件 运行为用户“root”和组“root”。这可能很危险。在执行“exec tshark -Vxr /var/tmp/PCRF/create_req.pcap”时(文件“./tcp_test.tcl”第7行)-bash-3.2#

标签: tcl exec eval


【解决方案1】:

Tcl 的exec 可能出于两个 原因引发错误。如果任一

,它就会这样做
  1. 子进程返回非零退出代码。
  2. 子进程写入标准错误。

第一个可能很烦人,但它确实是程序应该如何指示真正的错误。如果程序还以其他方式使用它(例如,说没有找到任何东西,就像 grep 那样),但那可能是一个问题。但是,在这种情况下,您会收到错误消息 child process exited abnormally,因此至少很容易弄清楚发生了什么。

更多的问题是当某些东西被写入标准错误时;写在那里的消息在换行符剥离后用作错误消息。即使只是换行符也会触发失败,并且该失败会覆盖从程序中获取真实值的任何机会(并且在只有换行符的情况下,非常神秘)。这是您的问题的(可能)重现:

% exec /bin/sh -c {echo >&2} % 设置错误信息 在执行时 “执行 /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 |… 将子进程作为管道运行,但这些可能有点过头了。


你不需要eval exec {stuff…};普通的旧 exec stuff… 完全等价,写起来更短,更容易正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多