Tcl 是否关闭文件名中的波浪线替换?

Tcl 是否关闭文件名中的波浪线替换?,tcl,Tcl,对于无法在文件命令(以及其他一些命令)中关闭平铺替换,是否已经或计划执行任何操作?我最近读到的关于这一点的文章是,但编程语言中如此危险的特性肯定不能被忽视?这难道不像让C函数Tcl_TildeSubst()检查全局Tcl变量的存在并基于它进行tide展开那样简单吗 我经常在shell脚本不够用时编写Tcl脚本,很多时候它包括比较、复制、打开、删除和/或重命名文件。在运行脚本之前,我总是使用find检查以波浪号(~)开头的文件名。我很想听听其他Tcl程序员是如何做到这一点的。Background

对于无法在文件命令(以及其他一些命令)中关闭平铺替换,是否已经或计划执行任何操作?我最近读到的关于这一点的文章是,但编程语言中如此危险的特性肯定不能被忽视?这难道不像让C函数Tcl_TildeSubst()检查全局Tcl变量的存在并基于它进行tide展开那样简单吗

我经常在shell脚本不够用时编写Tcl脚本,很多时候它包括比较、复制、打开、删除和/或重命名文件。在运行脚本之前,我总是使用
find
检查以波浪号(~)开头的文件名。我很想听听其他Tcl程序员是如何做到这一点的。

Background Tilde替换只发生在Tcl将要将字符串解释为文件名的位置,并且仅当字符串的第一个字符是
~
时才会发生(如果该字符位于其他位置,则这是完全正常的)。完全有两种替换:

  • 如果
    ~
    是独立的,或者后面跟有一个目录分隔符,那么它指的是您的主目录(严格来说,指的是
    home
    环境变量中命名的目录,默认为您的主目录)
  • 如果
    ~
    后面跟有其他内容,则文件名的剩余部分直到字符串末尾或第一个目录分隔符(以先到者为准)将被解释为用户名,
    ~user
    序列将替换为该用户的主目录(使用系统实用程序查找,如Unix上的
    /etc/passwd
    等中所列)
  • 这些功能在安全口译员中被禁用,即使用
    interp create-safe
    safe::interp create
    创建的口译员

    变通办法 阻止前面的
    ~
    成为问题的最简单方法是将
    /
    放在前面,并始终使用
    -目录
    选项来
    全局
    (否则,这是Tcl中唯一可以含糊不清地生成这些文件名的地方;在其他任何地方,它都可能是有意的)。在整个过程中使用完整的文件名通常会导致较少的问题(我建议如果可能,永远不要更改工作目录;这只会导致极大的混乱)

    我不认为安全的解释器是一种解决办法,因为它们还有许多其他限制性的特性(例如,默认情况下对文件系统没有访问权限)。 政策问题 至于应该可以禁用它的建议……这是一个有趣的建议,但从未向Tcl指导委员会认真提出过。问题是有很多代码假设当前的行为;我认为添加一个hack(例如,一个不受支持的变量)并不是一个特别的问题关闭它-在扩展完成的地方有一个解释器上下文,所以检查Tcl变量以确定是否执行它是很简单的-但是我个人非常担心这样的更改会意外地破坏什么


    堆栈溢出不是讨论此类更改的好环境。您最好在上提问。请注意,这有时是一个相当强大的辩论室(尽管几乎总是礼貌的)。另一种选择(如果您喜欢IRC)是在freenode上的#tcl上提问。

    感谢您给出了一个很好的答案,除了关于“黑客”和“神奇的值”。新功能一直被添加到Tcl中而没有被调用,如果你真的想添加一些东西,不破坏现有的代码就很容易做到。在最坏的情况下,你添加一个新命令。在它被修复之前,我会在我的脚本中放一个简单的程序:
    proc safeFilename{filename}{if{[string match”~*“$filename]}{return./$filename}或者{return$filename}
    ,或者另一个用于文件名列表(用于
    文件拆分
    文件联接
    调用之间)@potrzebie您知道,
    文件拆分
    在这方面很重要吗?它不会生成未受保护的
    ~
    ,除非它是输入的第一个字符。因此,除了没有-directory开关的glob命令外,如果没有输入以~?开头的文件名,则不会生成以~开头的文件名,这意味着打开您必须“保护”的ly文件名是来自程序之外的文件名,如argv?@potrzebie是的,尽管可以说这些文件名应该得到尊重:用户可能真的希望它们被解释为声明的文件名(我知道我会这样做)。它不会经常出现。我认为人们期望shell完成替换工作,而命令/程序不关心/不知道它,比如
    rm~/.profile
    /configure--prefix=$HOME
    (UNIX)和
    类型“%USERPROFILE%\mydoc.txt”
    (Windows)。在参数中包含主目录的路径没有问题,因此Tcl的第二轮额外替换是多余的。这也是危险的,因为人们并不期待它。