繁体   English   中英

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

[英]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

你能拆分stream吗?

up_out=$(upgrade.sh 2>&1)
up_status=$1
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 "$?"

Output:

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 的评论更新

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM