Tcl脚本无法在Linux上打开文件(Works on Windows)

时间:2014-06-12 19:10:53

标签: linux windows tcl

我有一个适用于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

2 个答案:

答案 0 :(得分:2)

您调用的函数可能正在更改当前工作目录。如果不检查代码,就无法确定哪一个可以,但是在调用[pwd]之前显示open可以检查是否是这种情况。

另一种可能出错的方法是脚本以不同的方式从Unix和Windows启动 - 例如通过Windows上的快捷方式和Unix上的PATH命令行。

答案 1 :(得分:1)

如果您有用户传入的文件名,并且您无法确定您所调用的代码不会cd,则建议您将文件名处理为 absolute 文件名尽快在您的脚本中出现,甚至可能在任何package requiresource来电之前。

这实际上很容易做到。

set absoluteFilename [file normalize $userProvidedFilename]

只要在C / C ++级别的第一个cd(或chdir() / SetCurrentDirectory()之前完成此操作),目录的未来更改将不会破坏路径。该脚本必须准备好使用绝对文件名,但这很容易完成。


您可以使用file join将相对路径转换为相对于任意目录的绝对路径:

set filename [file join [file normalize $arbitraryLocation] $relativeFilename]

file join比插入目录分隔符更聪明。)