【问题标题】:How to execute a shell script from a TCL script如何从 TCL 脚本执行 shell 脚本
【发布时间】:2023-04-14 20:04:17
【问题描述】:

我有一个 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 waiver.file手动运行脚本会发生什么?
  • 确保它有执行权限。什么。是linkRUN 吗?
  • 您的路径中是否存在checker.sh
  • @Shawn 是的,路径中确实存在 checker.sh。

标签: linux shell tcl exec eval


【解决方案1】:

如何运行它主要取决于 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 可能会更容易;这里的细节非常重要。)

【讨论】: