首页 > 解决方案 > 如何从 TCL 脚本执行 shell 脚本

问题描述

我有一个 Shell 脚本,它作为参数读入另一个文件。在 Shell 终端中,我像下面这样使用它:

source checker.sh waiver.file

现在,我想在 TCL 脚本中获取这个 shell 脚本,比如
TCL_script.tcl

link
set RUN .
exec checker.sh waiver.file

当我执行上面的 TCL 脚本时,终端只是挂起,它不起作用。

这里的任何专家可以帮助我在 TCL 脚本中运行 Shell 脚本吗?

谢谢!

标签: linuxshelltclexeceval

解决方案


如何运行它主要取决于它是如何checker.sh工作的。问题是 shell 的source命令通过读取脚本并在当前 shell 会话中执行它来工作(Tcl 的source工作方式类似,但它用于不同的语言)。因为它在同一个会话中,所以它可以访问它实际上不会作为子进程(或者更确切地说它会拥有它们,但它们不会持续存在)的各种功能。

从 Tcl 运行它的简单方法是这样的(假设你在正确的目录中):

exec sh checker.sh waiver.file

如果有问题,我不会感到惊讶!不幸的是,可能的问题非常广泛,以至于很难提前猜测如何解决它们。

也就是说,您遇到问题的事实有用的信息。这可能意味着脚本正在尝试以对管道不太满意的方式访问标准输入和输出。我们可以尝试通过重定向来解决这个问题:

exec sh checker.sh waiver.file <@stdin >@stdout 2>@stderr

如果这不起作用,您可能需要使用 Expect 运行。该expect程序是 Tcl,但有一些额外的命令。这可能足以让您入门:

spawn sh
send "source checker.sh waiver.file\r"
interact

很好地使用 Expect 还有很多。

(重写checker.sh可能会更容易;这里的细节非常重要。)


推荐阅读