在文件命令(以及其他一些命令)中是否已经完成或正在计划做什么关于无法关闭波浪号替换?我最近读到的是http://wiki.tcl.tk/28190,但是编程语言中的这种危险特性肯定不能被忽略吗?难道不是让C函数Tcl_TildeSubst()检查是否存在全局Tcl变量,并且根据它来做扩展或不扩展吗?
我经常在shell脚本不够时编写Tcl脚本,并且很多时候它包括比较,复制,打开,删除和/或重命名文件.在运行脚本之前,我总是find用来检查以波浪号(〜)开头的文件名.我很想知道其他Tcl程序员是如何做到这一点的.
Tilde替换仅发生在Tcl将字符串解释为文件名的位置,并且仅在字符串的第一个字符为a时发生~(如果字符在其他任何地方,则纯粹是正常的).完成了两个替换:
~它本身或后面是目录分隔符,它将引用您的主目录(严格地说,是指HOME环境变量中指定的目录,默认为您的主目录).~后跟其他任何内容,则直到字符串末尾或第一个目录分隔符(以先到者为准)的文件名的其余部分将被解释为用户名,并且~user序列将被该用户的主目录替换(查找使用系统实用程序,以便/etc/passwd在Unix上列出,等等)这些功能在安全的口译员中被禁用,即使用interp create -safe或使用创建的口译员safe::interpCreate.
阻止导致~成为问题的最简单方法是放在./前面,并始终使用-directory选项glob(这是Tcl中唯一可以模糊地产生这些文件名的地方;其他任何地方都可能是预期的).使用完整的文件名通常会导致整体问题减少(我建议如果可能的话,永远不要更改工作目录;这只会引起巨大的混乱).
我不会考虑安全解释器是一个解决办法,因为他们有许多其他的限制功能,以及(如没有访问所有以默认文件系统).
至于应该可以禁用它的建议......这是一个有趣的,但它从未被Tcl的指导委员会认真提出.问题是有很多代码假设当前的行为; 我认为添加一个hack(例如,一个魔术不支持的变量)来关闭它不是一个特殊的问题 - 在扩展完成时有一个解释器上下文,所以检查一个Tcl变量来看看是否要做这是微不足道的 - 但我个人非常担心这种变化会意外地破坏什么.
Stack Overflow不是讨论此类更改的非常好的环境.你最好在tcl-core邮件列表上询问.请注意,这是一个相当强大的辩论室有时(虽然几乎总是有礼貌).另一种选择(如果你喜欢IRC)是在freenode上询问#tcl.
| 归档时间: |
|
| 查看次数: |
509 次 |
| 最近记录: |