为什么tcl脚本作为shell脚本运行?

时间:2014-03-08 08:15:40

标签: tcl

我没有在TCL编程,但我确实使用它们,如tkcvs和tkdiff。我注意到他们将自己声明为shell脚本

#!/bin/sh
#-*-tcl-*-

更重要的是,通过tclsh运行它们也不起作用,我得到这样的错误:

Initialization failed

标题中的第二行也让我感到困惑,因为AFAIK,shell只看#!线。这是怎么回事?

1 个答案:

答案 0 :(得分:3)

Tcl脚本通常设置为使用比您所示略多的运行。它通常最强大,如下所示:

#!/bin/sh
# \
exec tclsh "$0" ${1+"$@"}

他们最初使用shell,因为tcl没有标准安装位置,因此无法依赖该位置。相反,通过启动系统shell并使用它来启动tclsh可执行文件,您可以确定运行已安装的tclsh,只要它存在于PATH上即可。 shell评估脚本并查看导致它执行已安装的tclsh二进制文件的exec tclsh "$0"并将其作为第一个参数传递给$ 0(脚本文件名),该参数使用tcl解释器重新运行脚本。

我的示例中的第二行在tcl解释器评估脚本时注释掉第三行。反斜杠导致第二行和第三行在被tclsh读取时被视为单个注释,因此tcl不会尝试再次运行exec。

在您的剪辑中,# -*-tcl-*-是标记,表示编辑文件时emacs使用的模式。见the documentation.

真的不足以继续提供错​​误消息。它似乎不是来自Tcl解释器本身。 (即tcl源中的'git grep'与该字符串不匹配)。