我有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
在这一点上,最好创建一个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