C 符号链接后跟“…”时,[file normalize$path]和realpath($path)之间的行为差异`
我发现Tcl的C 符号链接后跟“…”时,[file normalize$path]和realpath($path)之间的行为差异`,c,linux,tcl,C,Linux,Tcl,我发现Tcl的[文件规范化$path] 以及C中调用使用的路径解析,例如open()和 realpath() 它围绕着符号链接的使用展开,紧接着是。 设置:给定此目录结构(请注意,sidedir\u link是指向 不同目录): 当前目录是/tmp/subdir,我已经创建了这个命令 utils::realpath是对中的C函数realpath()的Tcl调用 这是成绩单。前两个调用显示如何解析符号 链接最后两个显示了在处理问题时的行为差异 紧跟在符号链接后面的。 wish% file nor
[文件规范化$path]
以及C中调用使用的路径解析,例如open()
和
realpath()
它围绕着符号链接的使用展开,紧接着是。
设置:给定此目录结构(请注意,sidedir\u link
是指向
不同目录):
当前目录是/tmp/subdir
,我已经创建了这个命令
utils::realpath
是对中的C函数realpath()
的Tcl调用
这是成绩单。前两个调用显示如何解析符号
链接最后两个显示了在处理问题时的行为差异
紧跟在符号链接后面的。
wish% file normalize sidedir_link/fileA.txt
/tmp/sidedir/fileA.txt
wish% ::utils::realpath sidedir_link/fileA.txt
/tmp/sidedir/fileA.txt
wish% file normalize sidedir_link/../fileA.txt
/tmp/subdir/fileA.txt
wish% ::utils::realpath sidedir_link/../fileA.txt
/tmp/fileA.txt
注:区别在于/tmp/subdir/fileA.txt
与/tmp/fileA.txt
具体来说,[file normalize$path]
似乎可以从词汇上解析。
通过删除路径的前面部分,而C实际上调用
解析符号链接并,然后应用。
。如果符号链接
如果要/some/location/far/far/away
,则解析路径为
/some/location/far/far/fileA.txt
我在Tcl文档、wiki或bug中找不到任何关于这一点的提及
跟踪系统
那么,这是一个Tcl bug吗?一个C库错误?预期行为
我正在使用Tcl 8.4.9和Redhat 6(是的,有点落后于时代…)
注意:我可以在Tcl 8.6.1中重现相同的行为
这一点很重要的原因是Tcl/Tk GUI指示文件存在(因为它使用
file
命令),但当后端实际使用C-library调用open()
打开文件时,运行失败(因为路径不同,并且不存在).这对我来说很像一个bug——鉴于我对路径名解析和规范化代码历史的记忆,我一点也不会感到惊讶——所以我已经做了。我不维护Tcl的这一部分,所以除了提交bug报告之外,我甚至不知道如何开始解决它。如果您想提供更多信息,请通过我们的问题跟踪器提供。这看起来像是与Tcl虚拟文件系统支持的交互。理论上,该路径可能指向web服务器路径,而realpath()
在那里不起作用,因此代码必须从文本表示开始工作。事实上,Tk中的open对话框甚至可以显示数据库BLOB中的一个文件,您的C库open()
调用也将失败。所以这可能是预期的行为,但可能是一个bug。在处理角落案例时,在代码的这一部分中发现了各种错误,因此不确定这一部分将如何分类。@schlenk我想你可以用这种方式来处理它,只是文件规范化实际上对符号链接做了正确的事(使用Unix文件系统的具体实现)当您不使用时。
。因此,它同样可以使用具体的实现来解决。
。例如,我可能有一个数据库BLOB,其中。
是一个有效的文件名(并且不引用父目录),在这种情况下,Tcl实现似乎永远不会工作……不确定您是否了解Tcl vfs系统,因此BLOB示例可能不好。但是为了回到正题,在路径中有一些关于文件规范化
和。
的测试(请参阅中的测试filesystem-1.*
)。我在那里没有看到你的确切案例,所以可能是一个遗漏的角落案例。我会检查一下。使用解释器解析w/out有点困难,但它们确实有一大堆..这不是第一次在文件normalize
中出现错误,但我们不能只使用realpath()
,因为它不知道Tcl的VFS层。(我不想解决这个子系统中的问题,这让我很害怕。)
wish% file normalize sidedir_link/fileA.txt
/tmp/sidedir/fileA.txt
wish% ::utils::realpath sidedir_link/fileA.txt
/tmp/sidedir/fileA.txt
wish% file normalize sidedir_link/../fileA.txt
/tmp/subdir/fileA.txt
wish% ::utils::realpath sidedir_link/../fileA.txt
/tmp/fileA.txt