$ date > '< abcd'
$ cat '< abcd'
<something>
$ tclsh8.5
% exec cat {< abcd}
couldn't read file " abcd": no such file or directory
哎呦。这是由于'exec'的规范。
如果arg(或args对)具有下面描述的形式之一,则exec使用它来控制子进程之间的输入和输出流。这些参数不会传递给子进程。在诸如“&lt; fileName“,fileName可以在”&lt;“的单独参数中,也可以在同一个参数中,没有中间空格”。
有办法解决这个问题吗?
答案 0 :(得分:4)
值是否必须作为参数传递?如果没有,你可以使用这样的东西:
set strToPass "< foo"
exec someProgram << $strToPass
对于文件名,您可以(几乎总是)传递完全限定名称。可以使用file normalize
获取完全限定名称:
exec someProgram [file normalize "< foo"] ;# Odd filename!
但是如果你需要传递一个<
(或>
)是第一个字符的参数,你就会陷入困境。 exec
命令总是使用重定向等参数;与Unix shell不同,你不能只使用引用来解决它。
但是你可以使用帮助程序。因此,在Unix上你可以这样做:
exec /bin/sh -c "exec someProgram \"$strToPass\""
(子程序只是将你想要运行的内容替换为你真正想要的参数。你可能需要使用string map
或regsub
在有问题的元字符前面加上反斜杠。)
在Windows上,你必须编写一个批处理文件并运行它,这有很多警告和令人讨厌的副作用,特别是对于GUI应用程序。
答案 1 :(得分:2)
一个简单的解决方案:使用重定向字符确保单词不开始:
exec cat "./< abcd"
稍微复杂一点:
exec sh -c {cat '< abcd'}
# also
set f {< abcd}
exec sh -c "cat '$f'"
这page on the Tcl Wiki讨论了这个问题。
答案 2 :(得分:0)
你试过这个吗?
% exec {cat < abcd}
答案 3 :(得分:0)
尝试:
设置myfile“&lt; abcd”
exec cat $ myfile