相当于 PIPESTATUS 的 Korn Shell

KornShell equivalant of PIPESTATUS

. ${script_name} | tee -a ${log_file}
不幸的是,

KornShell 没有像 Bash 那样的 PIPESTATUS 命令,我想知道是否有人有一个优雅的解决方案来获取第一个命令的退出状态(上图)。这是我从互联网上找到的代码拼凑而成的。

{
typeset -r script_rc=$(
{
  {
    . ${script_name}
    echo "$?" >&3
  } | tee -a ${log_file}
} 3>&1 >&4 4>&-
)
} 4>&1

不幸的是,这段代码很难阅读,我想知道是否有人知道更易读的东西。

您可以使用进程替换来完全避免管道,就像在 bash

中一样
. "${script_name}" > >(tee -a "${log_file}")

这具有在当前 shell 中实际 运行 宁 $script_name 的额外优势,我认为这是使用 . 到 [=20= 的重点] 它。 $?不会受到进程替换退出状态的影响。

尝试打开 pipefail

set -o pipefail

这将给出 return 零件管道中的第一个非零 return 代码。

不如 PIPESTATUS 强大。使调试更容易动手。但是你至少会捕获管道的故障部分而不会出现错误 return 代码被吞没并按下。