KornShell等同于PIPESTATUS

时间:2016-02-17 17:25:40

标签: bash shell unix redirect ksh

. ${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

不幸的是,这段代码难以阅读,我想知道是否有人知道更具可读性的内容。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

尝试打开pipefail

set -o pipefail

这将返回零件管道中的第一个非零返回代码。

不如PIPESTATUS健壮。使调试更加实际。但是您至少可以捕获管道的故障部分,而不会吞下并继续按下错误返回码。