小编ZiG*_*iGi的帖子

bash -e 和 && 函数内部的评估

-e设置选项时,我对 bash(和破折号)行为感到困惑。

简单的例子:

#!/bin/bash -e

func() {
    false && true
}

false && true

echo "1"

func

echo "2"
Run Code Online (Sandbox Code Playgroud)

输出:

1
Run Code Online (Sandbox Code Playgroud)

预期输出:

1
2
Run Code Online (Sandbox Code Playgroud)

虽然第一次出现按预期工作,但第二次出现(在函数内部)会导致立即退出。我搜索了文档,但无法找到对这种不同行为的解释。这背后有什么理由吗,还是这个错误?我在 bash 和 dash 中对此进行了测试,结果相同。

根据 bash 联机帮助页:

-e 如果管道(可能由单个简单命令组成)、列表或复合命令(参见上面的 SHELL GRAMMAR)以非零状态退出,则立即退出。如果失败的命令是紧跟在所述命令列表的一部分的壳不退出 whileuntil关键字,继该测试的一部分ifelif保留字,在执行任何命令的一部分&&||除命令列表以下的最终&&||,任何管道中的命令但最后一个,或者如果命令的返回值被!. 如果除子 shell 之外的复合命令由于命令在-e被忽略时失败而返回非零状态,则 shell 不会退出。一个陷阱ERR,如果设置,在 shell 退出之前执行。此选项分别适用于 shell 环境和每个子 shell 环境(参见上面的命令执行环境),并且可能导致子 shell 在执行子 shell 中的所有命令之前退出。

如果复合命令或 shell 函数在-e被忽略的上下文中执行,则在复合命令或函数体内执行的任何命令都不会受到-e …

shell bash dash shell-script

2
推荐指数
1
解决办法
95
查看次数

标签 统计

bash ×1

dash ×1

shell ×1

shell-script ×1