linux - 如何从 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
可能会更容易;这里的细节非常重要。)
推荐阅读
- javascript - Javascript交换功能
- python - ctypes 在 python 中导入 dll 但它不起作用
- process - 撤消 Powerapps 中的编辑标准流程
- prometheus - 如何从 Prometheus 中删除重复数据
- javascript - 等到一个元素有一个值——不只是存在
- csv - IMPORTDATA 的实际限制似乎低于宣传的(用 150 万个单元格测试 importdata)
- apache-spark - 在 pyspark 中连接两列并在其间添加文本
- javascript - node.js redis.get(key,callback) 即使在redis db中同时存在数据和键之后也会随机返回null
- laravel - Laravel 8 中存在的路线上的 404 错误
- blas - 如何在 C 中使用 dger (BLAS)