TCL在proc之后调用另一个proc

时间:2015-03-30 14:55:25

标签: linux tcl wait pid

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

create_difference "file1" "file2" 
create_compress "path"

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

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

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

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

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.

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

“状态”是 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
        }
    }
}