如何在源代码的Tcl脚本中读取流末尾(^Z
)之后的部分?
到目前为止,我得到info script
返回当前源脚本的文件名,我可以open
就像任何文件一样,并通过解析文件将读取位置放在流结束之后。
理论上,文件的内容可能会在source
和后续info script
以及open
的调用之间发生变化,从而可能导致读取脚本和二进制数据之间的时间不一致。
我错过了这个神奇的命令吗?或者我们是否依赖用户/管理员确保不会发生这种不一致?
答案 0 :(得分:2)
提供您的自定义source
,它在与包含脚本的源代码相同的I / O步骤中提取预告片。例如:
interp hide {} source source
proc ::source {fp} {
set size [file size $fp]
set chan [open $fp r]
info script $fp
try {
chan configure $chan -eofchar {\u001a {}}
set script [read $chan]
uplevel 1 [list eval $script]
set scriptOffset [chan tell $chan]
if {$scriptOffset < $size} {
chan seek $chan 1 current; # move cursor beyond eof
chan configure $chan -translation binary
set trailer [read $chan]
# do whatever you want to do with the trailer
}
} finally {
close $chan
}
}
source
内部相同的机制:configure -eofchar
。seek
用于将光标定位在脚本的偏移处。read
将为您提供预告片。免责声明:像Donal这样的Tcl巫师可能有更好的方法。此外,像starkits这样的单文件分发机制可能会有帮助来处理脚本预告片。