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