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
选项使其不打印匹配行,只是根据是否找到匹配来设置其退出状态。
我有一个功能,当我用 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
选项使其不打印匹配行,只是根据是否找到匹配来设置其退出状态。