我有一个适用于Windows的Tcl脚本。当我运行它并在提示时传入文件名时,通常使用相对目录路径。在Windows上,脚本将采用绝对OR相对目录路径......它可以工作,完全没有问题。
在Linux上,它不会以相同的方式工作。它只有在我拼出完整的文件路径时才会起作用,例如: /home/gxuser/input/test.txt
...它不会采用./input/test.txt
通过"工作"我的意思是它应该打开文件......它就在那里,权限很好。
在Linux上,程序失败并出现以下错误:
couldn't open "./input/test.txt": no such file or directory
while executing
"open $upload r"
代码中的违规行是:
set infile [open $upload r]
我做错了什么?我认为,我忽略了Tcl语言的一些细微差别,并假设它应该识别相对路径。
相关信息:
% puts $tcl_version
8.4
% info patchlevel
8.4.19
% uname -a
Linux gxengine 2.6.32-60-generic #122-Ubuntu SMP
答案 0 :(得分:2)
您调用的函数可能正在更改当前工作目录。如果不检查代码,就无法确定哪一个可以,但是在调用[pwd]
之前显示open
可以检查是否是这种情况。
另一种可能出错的方法是脚本以不同的方式从Unix和Windows启动 - 例如通过Windows上的快捷方式和Unix上的PATH
命令行。
答案 1 :(得分:1)
如果您有用户传入的文件名,并且您无法确定您所调用的代码不会cd
,则建议您将文件名处理为 absolute 文件名尽快在您的脚本中出现,甚至可能在任何package require
或source
来电之前。
这实际上很容易做到。
set absoluteFilename [file normalize $userProvidedFilename]
只要在C / C ++级别的第一个cd
(或chdir()
/ SetCurrentDirectory()
之前完成此操作),目录的未来更改将不会破坏路径。该脚本必须准备好使用绝对文件名,但这很容易完成。
您可以使用file join
将相对路径转换为相对于任意目录的绝对路径:
set filename [file join [file normalize $arbitraryLocation] $relativeFilename]
(file join
比插入目录分隔符更聪明。)