set -e 使函数提前停止 运行?

set -e makes function stop running early?

我有一个功能,当我用 set -e 打开错误时似乎会中断。我怀疑它正在按预期工作,但我看不出我做错了什么。

函数如下:

#!/usr/bin/env bash

set -e

my_function() {
    base_dir="/tmp/test"
    if [ ! -d $base_dir ]; then
        echo "Creating $base_dir"
        mkdir -p $base_dir
        touch $base_dir/some-file.txt
    fi

    is_edited=$(grep "foo" $base_dir/some-file.txt)

    if [ ! -z $is_edited  ]; then
        cd $base_dir
        echo "Doing stuff"
        docker run --rm debian ls
    fi

    echo
    echo "Done"
    echo
}

my_function

启用set -e,函数returns似乎没有命中回显语句。在 set -e 关闭的情况下,回显语句被命中。发生了什么事,我该如何解决?

如 fmtn07 所述,它带有 return 代码。

尝试更改 grep 语句:

is_edited=$(grep "foo" $base_dir/some-file.txt)

至:

is_edited=$(grep "foo" $base_dir/some-file.txt || true)

尝试使用:

is_edited=$(grep "foo" $base_dir/some-file.txt || test $? -eq 1)

如果找到匹配,grep 的退出状态为 0,如果没有找到匹配,则退出状态为 1,如果找到匹配,则退出状态为 2实际错误。因此,如果文件中没有 foo 的匹配项,它将被视为错误,并且 set -e 将终止脚本。上面的代码将 1 转换为成功,因此脚本只会在 grep 出现真正的错误时终止。

如果您不关心在 grep 出现错误时终止脚本,您可以使用

if grep -1 "foo" $base_dir/some-file.txt ; then
    ...
fi

-q选项使其不打印匹配行,只是根据是否找到匹配来设置其退出状态。