[英]how to pass command line parameter containing '<' to 'exec'
$ date > '< abcd'
$ cat '< abcd'
<something>
$ tclsh8.5
% exec cat {< abcd}
couldn't read file " abcd": no such file or directory
哎呀。 这是由于“exec”的规范。
如果一个 arg(或一对 args)具有下面描述的 forms 之一,则 exec 使用它来控制子进程之间的输入和 output 流。 这样的 arguments 不会传递给子进程。 在 forms 中,例如“<fileName”,fileName 可以位于与“<”不同的参数中,也可以位于同一参数中且没有中间空格”。
有没有办法解决这个问题?
该值是否必须作为参数传递? 如果没有,你可以使用这样的东西:
set strToPass "< foo"
exec someProgram << $strToPass
对于文件名,您可以(几乎总是)传递完全限定名。 可以使用file normalize
获得完全限定名称:
exec someProgram [file normalize "< foo"] ;# Odd filename!
但是如果你需要传入一个<
(或>
)是第一个字符的参数,你就被卡住了。 exec
命令总是使用 arguments 作为重定向; 与 Unix shell 不同,您不能只使用引用来解决它。
但是您可以使用帮助程序。 因此,在 Unix 上,您可以这样做:
exec /bin/sh -c "exec someProgram \"$strToPass\""
(子程序只是用您想要运行的内容替换自己,传入您真正想要的参数。您可能需要使用string map
或regsub
将反斜杠放在有问题的元字符前面。)
在 Windows 上,您必须编写一个批处理文件并运行它,这有很多警告和令人讨厌的问题,尤其是对于 GUI 应用程序。
一种简单的解决方案:确保单词不以重定向字符开头:
exec cat "./< abcd"
一个稍微复杂一点:
exec sh -c {cat '< abcd'}
# also
set f {< abcd}
exec sh -c "cat '$f'"
Tcl Wiki 上的这个页面稍微讨论了这个问题。
你试过这个吗?
% exec {cat < abcd}
尝试:
设置我的文件“< abcd”
执行猫 $myfile
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.