gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:39:55 24 4
gpt4 key购买 nike

我有一个带有标题 #!/bin/bash -e 的 bash shell 脚本。

我运行脚本时,grep命令运行后会中断,但是当我去掉参数-e后,脚本又可以正常运行了。参数-e是什么意思?

最佳答案

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

如果你想保留 -e 选项,但也有一个 grep 命令可能有效地找不到匹配项,你可以附加 || :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 ))
}

(注意使用 return 而不是 exit;我们会让 -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

(注意使用 command 来绕过它自己体内的 shell 函数:我们希望函数调用常规程序 grep,而不是无限递归) .

关于bash - bash shell命令行参数-e的含义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9952177/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com