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;我没有关闭正在写入差异的文件。
我有 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;我没有关闭正在写入差异的文件。