0

我有两种执行方式的 tcl 脚本 bash 脚本:

#exec bash ./run.sh
open "|bash ./run.sh r"

bash 脚本如下所示:

#!/bin/bash
ls
if [ "$?" != "0" ]; then
    echo "ERROR: Status failed!" > status
else
    echo "Everything is OK!" > status
fi

我正在使用 tclsh for Windows 和来自 git bash 的 bash。当我使用:

exec bash ./run.sh

我有状态文件:

一切都好!

否则:

open "|bash ./run.sh r"

得到:

错误:状态失败!

打开 tcl 管道时是否有可能正确检测退出代码?

4

1 回答 1

1

您没有描述是否从ls脚本的一部分中得到不同的结果。这很重要;该ls命令肯定能够根据调用它的环境改变其行为。这很重要,因为 Tcl直接使用CreateProcess()系统调用执行子进程(在 Windows 上),而不是 Cygwin 和 git bash 使用的各种包装版本。其他可能性是您在不同的目录中启动脚本等等。

但是,通常我们希望脚本在 viaexec或 via启动时的行为非常相似,open |… r因为它们共享一个共同的功能核心。唯一的区别在于如何等待输出和终止。


如果您创建一个子流程管道,默认情况下,您在创建管道之前不会从中发现错误closeexec“立即”生成任何错误,因为在子进程终止并读取所有输出之前它不会将控制权返回给您。

于 2020-03-01T07:12:03.383 回答