【问题标题】:KornShell equivalant of PIPESTATUSKorn Shell 相当于 PIPESTATUS
【发布时间】:2016-02-17 17:25:39
【问题描述】:
. ${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 shell unix redirect ksh


    【解决方案1】:

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

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

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

    【讨论】:

    • 不错!您可以添加示例:rm nonexistfile 2>&1 > >(tee /dev/null); echo $? 并在 touch nonexistfile 之后重复。
    【解决方案2】:

    尝试开启 pipefail

    set -o pipefail
    

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

    不如 PIPESTATUS 强大。使调试更加动手。但是您至少可以捕获管道的故障部分,而不会吞下并按下错误返回代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-05
      • 2010-11-28
      • 2017-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-05
      • 1970-01-01
      相关资源
      最近更新 更多