管道到日志文件命令后,Shell脚本不会退出

时间:2014-02-06 12:33:31

标签: linux bash shell pipe exit

请查看以下说明。 当我运行它时,。/ myscript.sh我在终端以及我的日志文件中获取所有echo语句。 但在执行后它不会退出或返回终端 请帮忙。我对脚本很安静。

#!/bin/sh

process() {
echo "Start..."
echo "Stop..."
exit 10
}

until [ $? -eq 10 ];
do
process | tee -a /home/temp/myLog.log
done

3 个答案:

答案 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了。

相关问题