没有 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
的评论
我有一个有限的 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
的评论