【问题标题】:Tcl: Special characters in 'exec' commandTcl:'exec'命令中的特殊字符
【发布时间】:2015-04-28 23:30:18
【问题描述】:

这是一个 Imagemagick 命令,用于从图像 foo.tiff 中检索像素值:

convert foo.tiff [1x1+40+30] -format %[fx:int(65535*r)],%[fx:int(65535*g)],%[fx:int(65535*b)] info:-

如何格式化它以使其能够被 Tcl 'exec' 命令接受?我尝试了各种转义各种字符,用大括号括起来等等。感谢您的建议...

【问题讨论】:

    标签: tcl


    【解决方案1】:

    如果您将该字符串拆分为列表,Tcl 会做正确的事情:

    set cmd {convert foo.tiff [1x1+40+30] -format %[fx:int(65535*r)],%[fx:int(65535*g)],%[fx:int(65535*b)] info:-}
    exec {*}[split $cmd]
    

    【讨论】:

    • 该字符串实际上已经是一个格式良好的列表。 exec {*}$cmd 会起作用。
    • 行得通!但是这个 {*} 是什么?这对我来说是全新的......感谢您的帮助。
    • 这是 Tcl 为数不多的语法规则之一:它将列表扩展为元素。假设set var [list foo bar baz]。当您调用acommand $var 时,“acommand”只接收一个参数,即列表 {foo bar baz}。当您调用acommand {*}$var 时,“acommand”会接收 三个 参数,即字符串“foo”、“bar”和“baz”。参见tcl.tk/man/tcl8.6/TclCmd/Tcl.htm——在 Tcl 8.4 和更早的版本中,我们不得不求助于eval 来达到同样的效果。
    【解决方案2】:

    就我个人而言,我只是引用不能用{}代替的位:

    exec convert foo.tiff {[1x1+40+30]} -format {%[fx:int(65535*r)],%[fx:int(65535*g)],%[fx:int(65535*b)]} info:-
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多