繁体   English   中英

如何将包含'<'的命令行参数传递给'exec'

[英]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 mapregsub将反斜杠放在有问题的元字符前面。)

在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM