【问题标题】:Open file in Tcl with variables inside在 Tcl 中打开文件,里面有变量
【发布时间】:2020-04-13 14:40:01
【问题描述】:

我想打开一个名为filelist.txt 的文件,它只包含字符串${PATHFILE}/test.txt,读取该行并打开文件test.txt。文件test.txt 存在于文件夹~/testfile 中。
考虑这个示例代码:

#!/usr/bin/env tclsh

set PATHFILE "~/testfile"

set fp [open "filelist.txt" r]
set lines [split [read $fp] "\n"]
close $fp   

foreach line $lines {
    set fp1 [open $line r]
    close $fp1
}

问题是“打开”命令似乎找不到PATHFILE 变量,我收到此错误:

couldn't open "${PATHFILE}/test.txt": no such file or directory

如果我尝试使用set fp1 [open "${PATHFILE}/test.txt" r] 打开文件,我没有任何错误。

【问题讨论】:

  • 可能 subst 命令wiki.tcl-lang.org/page/subst 会有帮助吗?
  • 谢谢你,通过使用set fp1 [open [subst $line] r]我能够解决这个问题!
  • Tcl 从不替换字符串中的任何内容,除非被告知。
  • filelist.txt 中的每个文件路径是否都植根于$PATHFILE?如果是,为什么首先要在filelist.txt 中维护变量引用?通过调用 file join $PATHFILE $line ... 并让 filelist.txt 仅包含 test.txt\ntest2.txt\ntest3.txt 等,更好地在脚本中组装完整的文件路径。

标签: shell scripting tcl tclsh


【解决方案1】:

是的,您可以使用TCL subst command 来评估PATHFILE 变量。请注意,波浪号 ~ 可能仍然存在问题 - 使用完整路径名可能会更好。

#!/usr/bin/env tclsh

set PATHFILE "~/testfile"

set fp [open "filelist.txt" r]
set lines [split [read $fp] "\n"]
close $fp   

foreach line $lines {
    set fp1 [open [subst $line] r]
    close $fp1
}

【讨论】:

  • 为了保护自己免受恶意攻击,请使用subst -nocommands -nobackslashes $line -- 参见tcl.tk/man/tcl8.6/TclCmd/subst.htm
  • 可以考虑对打开的文件(split [subst -nocommands -nobackslashes [read $fp]] \n)的全部内容应用一次subst,然后处理每一行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
相关资源
最近更新 更多