为什么这个bash脚本无法退出?

4

这可能是一个基础问题,但我不确定为什么记录日志会导致此退出函数不能按预期工作:

#!/bin/bash

function exitFunct
{
  exit 1
}

exitFunct  2>&1 | tee -a /var/tmp/output.txt
echo "You should never see this"

但是输出结果是“你永远不应该看到这个”。
1个回答

6
根据命令man bash的解释,管道中的每个命令都会作为一个单独的进程执行(例如,在一个子shell中)。因此,函数中的exit仅退出运行该函数部分管道的子shell。另外,根据下述说明:
引用:

除非启用了pipefail选项,否则管道的返回状态是最后一个命令的退出状态。

因此,您可以在管道前加入一些命令来改变其行为。
set -eo pipefail

在脚本中添加-e可以使您的脚本在错误发生时停止。不过,请注意使用exit 0不能结束它。


这意味着函数中的 exit 是退出由管道生成的子Shell而不是父Shell。(只是为了明确这一点。) - Etan Reisner
@wizurd:如果你不想让 grep 结束脚本,可以在 or 中处理这种情况:grep ... || echo 没有找到任何内容 - choroba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接