【问题标题】:How to call bash commands from tcl script?如何从 tcl 脚本调用 bash 命令?
【发布时间】:2011-05-06 05:43:33
【问题描述】:

Bash 命令可从交互式 tclsh 会话中获得。例如。在 tclsh 会话中,您可以拥有

% ls

而不是

$ exec ls

但是,你不能有一个直接调用 bash 命令的 tcl 脚本(即没有exec)。

如何让 tclsh 在解释 tcl 脚本文件时识别 bash 命令,就像在交互式会话中一样?

我猜有一些 tcl 包(或类似的东西),它会在启动交互式会话时自动加载,以支持直接调用 bash 命令。如何在 tcl 脚本文件中手动加载?

【问题讨论】:

    标签: bash exec tcl interactive


    【解决方案1】:

    如果您想在脚本中使用特定实用程序,请编写桥接程序:

    proc ls args {
        exec {*}[auto_execok ls] {*}$args
    }
    

    这甚至适用于大多数 shell 内置程序或 Windows。 (公平地说,您通常不想使用外部ls;内部glob 命令通常就足够了,有时还需要一些file 子命令的额外帮助。)有些命令需要更多的工作(例如,重定向输入,使其来自终端,带有额外的<@stdin</dev/tty;在某些平台上stty 需要)但效果相当好。

    但是,如果您要求的是任意执行外部程序而没有任何额外的代码来标记它们是外部的,那么这被认为违反了 Tcl 的精神。问题是它使代码更难维护。您正在做一个昂贵的调用而不是使用内部的(相对)便宜的东西,这并不明显。在那种情况下放入exec 并不是繁重的......

    【讨论】:

    • 可以说,这不仅违背了 Tcl 的精神,而且总体上也只是糟糕的编程。
    【解决方案2】:

    这里发生的情况是,当您键入像 ls 这样的命令时,会调用 unknown proc,因为这不是现有的 tcl 命令,默认情况下,该命令将检查该命令是否从一个交互式会话,来自顶层(不是间接在 proc 主体中),它正在检查 proc 名称是否存在于路径上的某处。您可以通过编写自己的 proc unknown 来获得类似的东西。

    为了有个好的开始,请检查

    的输出
    info body unknown
    

    【讨论】:

    • +1:这是路径的开始,但我相信它会导致代码不佳。最好让exec 调用明确的 IMO……
    • @Donal:是的,我同意。显式优于隐式,我绝不会真正建议重写未知的过程来执行此操作或其他任何事情,除非可能是为了增强已经存在的自动加载功能。
    【解决方案3】:

    您应该知道的一件事是ls 不是 Bash 命令。它是一个独立的实用程序。 tclsh 如何运行这些实用程序的线索就在它的名字中——sh 的意思是“shell”。所以它粗略地等同于 Bash,因为 Bash 也是一个外壳。 Tcl != tclsh 所以你必须使用exec

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-02
      • 2015-04-24
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多