请查看以下说明。 当我运行它时,。/ myscript.sh我在终端以及我的日志文件中获取所有echo语句。 但在执行后它不会退出或返回终端 请帮忙。我对脚本很安静。
#!/bin/sh
process() {
echo "Start..."
echo "Stop..."
exit 10
}
until [ $? -eq 10 ];
do
process | tee -a /home/temp/myLog.log
done
答案 0 :(得分:3)
管道的退出代码是管道中 last 进程的退出代码。所以在这里,即使process
退出代码10,整个管道process | tee ...
也会以代码0退出。
您可以使用pipefail
选项
set -o pipefail
现在,管道的退出代码将是任何管道进程的最后一个非零退出代码,如果它们都成功退出,则为0。
This blog post很好地解释了,官方参考是this section of the Bash manual的最后一段。
答案 1 :(得分:1)
尝试使用$ {PIPESTATUS [0]}抓取管道第一部分的结果:
#!/bin/sh
process() {
echo "Start..."
echo "Stop..."
exit 10
}
result=0
until [ $result -eq 10 ]
do
process | tee -a myLog.log
result=${PIPESTATUS[0]}
echo $result
done
答案 2 :(得分:1)
将管道移到环路后面;结果是一样的,但破坏将起作用:
#!/bin/sh
process() {
echo "Start..."
echo "Stop..."
exit 10
}
until [ $? -eq 10 ]
do
process
done | tee -a /home/temp/myLog.log
正如其他人在我之前指出的那样,管道的退出状态很复杂,因此您不能只使用$?
来获取它。最佳解决方案似乎是在您需要退出状态的上下文中摆脱管道。
也许你甚至不再需要-a
了。