C 符号链接后跟“…”时,[file normalize$path]和realpath($path)之间的行为差异`

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

我发现Tcl的
[文件规范化$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