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

Vah*_*agn 5 bash interactive tcl exec

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

% ls
Run Code Online (Sandbox Code Playgroud)

代替

$ exec ls
Run Code Online (Sandbox Code Playgroud)

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

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

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

Don*_*ows 10

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

proc ls args {
    exec {*}[auto_execok ls] {*}$args
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 可以说,这不仅违背了 Tcl 的精神,而且总的来说也是糟糕的编程。 (2认同)

Sin*_*ion 7

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

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

info body unknown
Run Code Online (Sandbox Code Playgroud)

  • +1:这是跟踪的开始,但我相信它会导致代码不佳.最好让`exec`调用显式的IMO ...... (3认同)