【问题标题】:Why does return statement not behave as expected in the shell function?为什么 return 语句在 shell 函数中的行为不符合预期?
【发布时间】:2021-05-07 13:19:17
【问题描述】:
function foo()
{
    ls / | while read LINE;
    do
        echo "step1"
        return
    done

    echo "step2"
}

foo

我希望 shell 脚本能够输出:

step1

然而,真正的输出是:

step1

step2

为什么 return 语句在 shell 函数中的行为不符合预期?

【问题讨论】:

  • 出于同样的原因( echo x; exit; ) ; echo y 将输出 x 和 y。 |为右操作数和左操作数创建一个子shell。 return 适用于该子外壳,而不是您的功能。用y() { ( echo x; return; ) ; echo y; }; y检查它

标签: linux bash shell unix sh


【解决方案1】:

问题似乎是管道引起的子壳。 return 不仅可以用于从函数返回,还可以用于从源文件返回。 subshel​​l 似乎也有类似的处理; return 不再是函数返回语句,而是 shell 退出语句。 控制“开始”通过离开循环离开函数,但是当子shell退出时,函数“忘记”退出。或者该函数实际上并没有看到 return 语句正在执行因为它在子 shell 中执行。

(感谢@zilog 的评论让我想到了源文件的角度。)

您可以启用lastpipe 选项以获得您期望的行为,因为| 不会产生新的子shell。

【讨论】:

  • 嗨,我猜 OP 问题意味着寻找一种方法从 while 子shell 中退出函数。我建议您为此添加一种方法,例如通过&&|| 使用while退出状态。 (lastpipe 很好,但在执行脚本/命令时可能会出现问题)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
  • 2012-12-07
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
  • 2018-04-05
  • 2022-01-07
相关资源
最近更新 更多