bash shell命令行参数-e的含义是什么?

前端之家收集整理的这篇文章主要介绍了bash shell命令行参数-e的含义是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有bash shell脚本头#!/ bin / bash -e。

当我运行脚本时,它将在grep命令运行后中断,但是当我删除参数-e时,脚本可以正常运行。参数-e的含义是什么?

-e选项意味着“如果任何管道以非零(”错误“)退出状态结束,立即终止脚本”。由于grep在没有找到任何匹配时返回退出状态1,即使没有真正的“错误”,也可能导致-e终止脚本。

如果你想保留-e选项,但也有一个grep命令可能有效地找不到匹配,你可以追加||。 :to the grep命令。这意味着“或者,如果grep命令返回非零退出状态,运行:(它什么也不做)”;所以净效果是禁用grep命令的-e。所以:

grep PATTERN FILE... || :

编辑添加:上面的方法丢弃每个错误:如果grep返回1,因为它发现没有匹配,这被忽略,但如果grep返回2,因为有一个错误,被忽略,如果grep不在路径中Bash返回127),被忽略 – 等等。所以,而不是:,最好使用一个命令来检查结果代码,如果它不是1,重新发出错误。例如:

grep PATTERN FILE || (( $? == 1 ))

但这破坏了退出状态;通常,当失败的命令使用-e终止Bash脚本时,脚本将返回命令的退出状态,但在上面的示例中,脚本将只返回1.如果(并且只有)我们关心它,我们可以修复它通过写这样:

grep PATTERN FILE || exit_code=$?
if (( exit_code > 1 )) ; then
    exit $exit_code
fi

(第一行c / o dsummersl评论)。

在这一点上,最好创建一个shell函数来处理这个:

function grep_no_match_ok () {
    local exit_code
    grep "$@" || exit_code=$?
    return $(( exit_code == 1 ? 0 : exit_code ))
}

(注意使用返回而不是退出;我们将让-e在适当时处理退出);这样,我们可以只写:

grep_no_match_ok PATTERN FILE     # won't kill script if no matches are found

事实上,由于我们最有可能想在这个脚本中使用这个函数来处理grep的所有事件,我们实际上可以命名函数grep:

function grep () {
    local exit_code
    command grep "$@" || exit_code=$?
    return $(( exit_code == 1 ? 0 : exit_code ))
}

grep PATTERN FILE     # won't kill script if no matches are found

(注意使用命令来绕过其自身体中的shell函数:我们希望该函数调用常规程序grep,而不是无限递归)。

猜你在找的Bash相关文章