【问题标题】:TCL exec with special characters in listTCL exec 列表中有特殊字符
【发布时间】:2016-09-12 17:01:48
【问题描述】:

有一个 tcl 过程 执行存储在 tcl 列表中的命令。 例如:

catch { exec $list}

列表看起来像:

--option1 op1 --option2 op2 --option3 op3 ...

其中一个 选项 是正则表达式,如下所示:

(.*[/\])?(sh|bash)(\.exe)?

用 exec option 替换后的样子:

{(.*[/\])?(sh|bash)(\.exe)?}

但我需要的是:

"(.*[/\])?(sh|bash)(\.exe)?"

在这种情况下我该怎么办?

【问题讨论】:

    标签: tcl exec special-characters


    【解决方案1】:

    当一个列表被转换为一个字符串时,它会被转换为一个规范的形式,然后再转换回同一个列表。

    您看到的是用于确保规范形式正确转换回来的引用字符。

    所以这个值是正确的。

    exec $list 只将一个参数传递给exec。 exec 将一系列单词作为参数,而不是包含单词的列表。

    exec 命令应该是:

    catch { exec {*}$list }
    

    {*} 语法将列表转换为其组成词。

    在旧版本的 tcl 中,必须使用 eval 语句:

    catch { eval exec $list }
    

    参考:exec、eval、{*} (section 5 of Tcl)

    【讨论】:

      【解决方案2】:
      1. exec 将 commnad 作为子进程执行

      2. 查看示例:

        作品:

        执行 ps aux | grep tclsh

        不工作:

        exec "ps aux | grep tclsh"

        exec [list ps aux | grep tclsh]

        但工作正常:

        eval exec "ps aux | grep tclsh"

        eval exec [list ps aux | grep tclsh]

      所以我们在执行 - 创建命令(exec ps aux | grep tclsh) 并调用它之前进行了评估。所以 eval 不关心类型。

      1. 对于带有选项的当前情况:exec someExecutable --option1 op1 --option2 op2 --option3 (.*[/\])?(sh|bash)(\.exe)?

      我会推荐这样的解决方案:

      set op3 {"(.*[/\])?(sh|bash)(\.exe)?"}
      lappend cmd  [someExecutable --option1 op1 --option2 op2 --option3 $op3]
      set cmd [join $cmd]
      eval exec $cmd
      

      [join $cmd] 从列表中创建字符串 - 并且没有任何 { }

      【讨论】:

        猜你喜欢
        • 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
        相关资源
        最近更新 更多