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,而不是无限递归)。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- vue与bootstrap实现时间选择器的示例代码
- icons – 如何设置应用程序图标为Electron/Atom Shell App
- 基于Scala约束的类型和文字
- vim – Javascript Lint声称额外的分号是坏的(在`if`之后)
- angularjs – 如何使用$rootScope传递对象?
- 从Angular 5更新到6后,我不断收到错误:无法解析xml2js中的
- twitter-bootstrap – Bootstrap类的完整列表
- 公布一些常用的WebServices,希望对大家的应用有帮助~
- angularjs – 如何将数组传递给指令而不将其转换为字符串?
- BIEE 11g WebService指南