如何从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脚本吗?

谢谢!

解决方法

如何运行它在很大程度上取决于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可能会更容易;这里的细节很重要。)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...