如何从tcl脚本调用bash命令?

时间:2010-11-07 07:55:43

标签: bash exec tcl interactive

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

% ls

而不是

$ exec ls

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

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

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

3 个答案:

答案 0 :(得分:10)

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

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

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

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

答案 1 :(得分:7)

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

为了一个良好的开端,检查

的输出
info body unknown

答案 2 :(得分:4)

您应该知道的一件事是ls不是Bash命令。这是一个独立的实用程序。关于tclsh如何运行这些实用程序的线索就在其名称中 - sh表示“shell”。所以它与Bash相当粗糙,因为Bash也是一个shell。 Tcl!= tclsh所以你必须使用exec