2011-08-13 94 views
2
$ date > '< abcd' 
$ cat '< abcd' 
<something> 
$ tclsh8.5 
% exec cat {< abcd} 
couldn't read file " abcd": no such file or directory 

哎呦。这是由于'exec'的说明。如何将包含'<'的命令行参数传递给'exec'

如果arg(或args对)具有下面描述的形式之一,那么exec将使用它来控制子进程之间的输入和输出流。这些参数不会传递给子进程。在形式,如“<文件名”,文件名可以是从“<”或相同的参数中间没有空格”一个单独的参数。

是否有办法来解决此问题?

+0

要关闭此循环,它似乎是'exec'的一个限制,它不能将以'<'开头的参数传递给下游程序。我修补了我的'exec'副本,要求重定向操作符是一个单独的单词。因此,cat user188012

回答

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应用程序。

+0

感谢您确认我被卡住了,如果我想传递以'<'开头的参数。是的,我要么混合使用上述方法,要么修补我的Tcl副本(我有能力将解释器与我的程序打包在一起)。 – user188012

0

你有没有试过这种

% exec {cat < abcd} 
+0

对不起,不起作用(如预期)。它试图找到名为'猫 user188012

0

尝试:?

集MYFILE “< ABCD”

EXEC猫$ MYFILE

+0

不起作用(我实际上已经尝试过这种方法,但我已将您的命令粘贴到提示符中)。 – user188012

+0

我不在我的电脑,所以我不能尝试它。尝试使用反斜杠转义<。 – TrojanName

+1

这绝对不行;如果'exec'在一个单词的开始处看到'<',则它是一个重定向,如果它不在开始处,它不会在参数的开始处。这是Tcl已知的错误特征。 –

2

一个简单的解决方案:确保一字不开始与重定向字符:

exec cat "./< abcd" 

一个稍微复杂一些:

exec sh -c {cat '< abcd'} 

# also 
set f {< abcd} 
exec sh -c "cat '$f'" 

page on the Tcl Wiki会谈关于这个问题一点。

+0

我给了你一个体面的解决方案upvote这个问题和维基链接,但在我的情况'猫'命令只是为了说明目的。 '回声'会成为我真正做的更好的类比。我想将字符串按原样传递给下游程序。 – user188012

+0

你不能把'cm -c'换成'''''?这使得'<'符号不在exec的范围之内。 –

+0

是的,我可以。但是,我可能不得不下降到引用地狱。我努力避免这样做。 :)它确实看起来像Tcl的exec不能将以'<'开头的参数传递给下游程序。 – user188012

相关问题