TCL 在 proc 之后调用另一个 proc

TCL calling another proc after a proc

我有 2 个 proc,一个接一个调用。第一个过程使用 diff 功能并创建 file.txt。压缩文件后的过程。问题是当我 运行 脚本时, file.txt 是空的。当我注释掉压缩过程时,文件中打印了差异。 我相信这是因为第二个过程没有等待第一个过程完成。

create_difference "file1" "file2" 
create_compress "path"

上面的过程调用顺序产生一个空 file.txt.gz

create_difference "file1" "file2" 
#create_compress "path"

以上过程调用的顺序创建了一个预期的差异文件。 在 procs 中,我尝试添加一个 return 语句(到 return 1),这没有什么不同。

我尝试使用 wait 命令,如 Waiting for background processes to finish before exiting script:

create_difference "file1" "file2" 
wait
create_compress "path"

但是脚本此时挂起。

创建差异的过程:tcl: capture output from "exec diff" which returned non-zero

set dso1 [open file.txt w]
set status [catch {exec diff $file1 $file2} result]
if {$status == 0} {
   puts $dso1 "$file1 and $file2 are identical"
} elseif {$status == 1} {
   puts $dso1 "** $file1 and $file2 are different **"
   puts $dso1 "***************************************************************************"
   puts $dso1 ""
   puts $dso1 $result
   puts $dso1 ""
   puts $dso1 "***************************************************************************"
} else {
   puts stderr "** diff exited with status $status **"
   puts stderr "***********************************************************************"
   puts stderr $result
   puts stderr "***********************************************************************"
}

压缩文件的过程:

proc create_compress  {thepath} {
        catch {exec find ${thepath}/. -type f -exec gzip "{}" \; } result
        #return 1
}

那里还有一些其他文件需要压缩,这就是为什么我压缩文件夹中的每个文件,给定文件夹的路径。其他文件按预期压缩。

我 运行 对其进行了更多测试。似乎即使在 diff proc 被调用并完成之后,差异也只会在脚本结束后写入 file.txt。一直到脚本末尾,都会创建差异文件,但它的大小为 0。

set status [catch {exec diff $file1 $file2} result]

"status"不是diff的退出状态,是catch的退出状态。不一样。要获取 diff 的退出状态:

if {$status == 1} {
    set err_type [lindex $::errorCode 0]
    if {$err_type eq "NONE"} {
        # diff exited with exit status 0 but printed something
        # to stderr
    } elseif {$err_type eq "CHILDSTATUS"} {
        # diff returned non-zero status
        set diff_exit_status [lindex $::errorCode end]
        if {$diff_exit_status == 1} {
            # diff results in $result
        } else {
            # diff had some kind of trouble
        }
    }
}

差异文件没有被写入是因为它没有关闭。在我的 create_diff 过程中,我忘记包含命令:close $dso1 因此,一旦脚本完成 运行,它才会写入文件。但是,在 diff proc 之后,我压缩了文件,由于它无法写入压缩文件,因此文件将是空的。

Tldr;我没有关闭正在写入差异的文件。