tcl exec如何正常工作?

时间:2014-03-11 18:38:28

标签: exec tcl

我正在自动完成一些需要在某些.pcap文件上调用tcpdump -nn -tt -r的工作。

要做到这一点,我使用以下tcl代码:

set magic_dir "results/pcap/";
set magic_filename "data"
set magic_node_count 16
set magic_command "tcpdump"

for {set i 0} {$i <= $magic_node_count} {incr i} \
  {
    set filename "${magic_dir}${magic_filename}-${i}-0.pcap"
    if {[file exists $filename]} \
      {
        set dest_dir "${magic_dir}\.\./tmp/tmp_${i}"
        exec ${magic_command} -nn -tt -r ${filename} > ${dest_dir}
      } \
  }

这可行(第一个文件被转换)但tcl报告该行中的错误。 当我尝试使用grep时,在脚本中稍后会发生同样的事情。我通过使用catch来避免这种情况,但我想知道如何正确使用此命令。

1 个答案:

答案 0 :(得分:2)

默认情况下,如果

,Tcl的exec会生成错误
  1. 该命令具有非零退出代码或
  2. 该命令在其标准错误通道上生成输出。
  3. 在这两个中,您几乎必须使用catch(或Tcl 8.6中的try / trap)处理第一个问题,因为这几乎总是一个真正的错误。 (或者不是; grep是一个经典问题。)但是使用标准错误处理,你有更多选择(假设你是using 8.5)。

    例如,您可以重定向到终端:

    exec ${magic_command} -nn -tt -r ${filename} > ${dest_dir} 2>/dev/tty
    

    或正常的标准错误频道:

    exec ${magic_command} -nn -tt -r ${filename} > ${dest_dir} 2>@stderr
    

    或者你可以告诉Tcl扔掉它:

    exec -ignorestderr ${magic_command} -nn -tt -r ${filename} > ${dest_dir}
    

    甚至将其组合成标准输出:

    exec ${magic_command} -nn -tt -r ${filename} > ${dest_dir} 2>@1
    

    通过引入额外的管道(例如,使用8.6 chan pipe或通过外部cat -u处理棘手)可以获得更多异国情调但是开始让真正复杂快速。既然你正在自动化tcpdump,你可能最好只将所有东西合二为一并使用它。或者使用Expect包的相当大的功能和复杂性。