如何传递包含'<'的命令行参数'执行'

时间:2011-08-13 15:17:17

标签: tcl

$ 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;“的单独参数中,也可以在同一个参数中,没有中间空格”。

有办法解决这个问题吗?

4 个答案:

答案 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 mapregsub在有问题的元字符前面加上反斜杠。)

在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