没有 bash&PIPESTATUS 的管道命令 return 代码

Piped commands return code without bash&PIPESTATUS

我有一个有限的 busybox 单元,它只有 /bin/sh,所以没有 bash 也没有 PIPESTATUS

正在尝试运行命令:

upgrade.sh 2>&1 | tee -a log.log | udplogger

现在我需要获取 upgrade.sh 的退出代码以继续进一步升级或停止。

知道怎么做吗?在 bash 上你有 pipestatus 在那里我可以得到第一个命令的结果但是只有 /bin/sh 我不知道。

谢谢

如果您可以在子 shell 中执行该管道,则可以使用这样的重定向:

{ status=$(
  { { upgrade.sh 2>&1
      echo $? >&3
    } | tee -a log.log | udplogger >&4
  } 3>&1 )
} 4>&1
echo $status

你能分流吗?

up_out=$(upgrade.sh 2>&1)
up_status=
echo "${up_out}" | tee -a log.log | udplogger
echo "${up_status}"

选择:
使用特殊功能:

store() { echo $? > pipestatus; }
popup() { cat; status=$(cat pipestatus); rm pipestatus; return "${status}"; }

演示:

touch strange_file
{ rm strange_file 2>&1 ; store; } | tr '[[:lower:]]' '[[:upper:]]' | popup ; echo "$?"
{ rm strange_file 2>&1 ; store; } | tr '[[:lower:]]' '[[:upper:]]' | popup ; echo "$?"

输出:

0
RM: CANNOT REMOVE 'STRANGE_FILE': NO SUCH FILE OR DIRECTORY
1

你的情况:

{ upgrade.sh 2>&1; store; } | tee -a log.log | udplogger | popup

并使用 $?.

可以这样处理错误:

fifo=/tmp/upgrade.sh.fifo
mkfifo $fifo
tee -a log.log < $fifo | udplogger &

if  upgrade.sh 2>&1; then
    echo Carry on >&2
else
    echo Stop >&2
fi > $fifo
rm $fifo

已更新 根据 oguz ismail

的评论