我有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.
答案 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
}
}
}