我在这里看到,测试是否$?是零(成功)还是其他什么(失败)是一种反模式,但我在其他任何地方都找不到。
坚持维基百科中反模式的定义:“反模式(或反模式)是对反复出现的问题的常见反应,通常是无效的,并且有可能产生严重的反作用。”为什么这是一种反模式?
在我看来,如果您不需要命令的返回值并且只需要检查状态,这是一种反模式。
如果我们需要函数返回值和退出代码,没有其他方法(或者我不知道,如果我错了,请纠正我)。在下面的示例中,只有在前一个命令成功并且在其他函数中使用返回值时,我们才需要继续
示例:
test() { echo "A" ; return 1; }
l_value=$(test); l_exit_code=$?;
if (( l_exit_code == 0 )); then
fn_other_function_to_pass_value $l_value
else
echo "ERROR" >&2
exit 1
fi
这是一种反模式,因为它引入了复杂性,如果您根本不需要记录退出状态,那么这种复杂性就不存在。
if your_command; then ...
比起
your_command
if [ "$?" -eq 0 ]; then ...
例如,可能出错的事情:想想陷阱,甚至是为调试、修改而添加的新的echo语句 。对于读者来说,如果不更改逻辑流,运行您的\u命令的单独一行不能在其下面添加任何内容,这在视觉上是不明显的。
即:
your_command
echo "Finished running your_command" >&2
if [ "$?" -eq 0 ]; then ...
...正在检查回声,而不是实际命令。
因此,如果您确实需要以比立即分支其值是否为零更精细的方式处理退出状态,您应该在同一行中收集它:
# whitelisting a nonzero value for an example of when "if your_command" won't do.
your_command; your_command_retval=$?
echo "Finished running your_command" >&2 ## now, adding more logging won't break the logic.
case $your_command_retval in
0|2) echo "your_command exited in an acceptable way" >&2;;
*) echo "your_command exited in an unacceptable way" >&2;;
esac
最后:如果将您的\u命令包含在一条If语句中,这会将其标记为已测试,这样您的shell就不会考虑非零退出状态来执行set-e或ERR陷阱。
因此:
set -e
your_command
if [ "$?" -eq 0 ]; then ...
...永远不会(除了困扰设置-e
的行为的许多角落情况和警告)以$的任何值到达
除了if
语句?0
,因为set-e
将在这种情况下强制退出。相比之下:
set -e
if your_command; then ...
...将your_command
的退出状态标记为已测试,因此不考虑强制脚本退出的原因。
问题内容: 我有此查询,如果返回成功,则我要处理另一个函数,否则请不要处理该函数。 这是用于运行查询的代码 我想这就像… 问题答案: 这是您可以测试的最简单的方法
为什么命令以开头?这是我看到它的网站。
本文向大家介绍通过什么命令查找执行命令?相关面试题,主要包含被问及通过什么命令查找执行命令?时的应答技巧和注意事项,需要的朋友参考一下 答案: which 只能查可执行文件 whereis 只能查二进制文件、说明文档,源文件等
本文向大家介绍使用什么命令查看网络是否连通?相关面试题,主要包含被问及使用什么命令查看网络是否连通?时的应答技巧和注意事项,需要的朋友参考一下 答案: netstat
问题内容: 也许我的问题是新手,但是我真的无法理解在什么情况下使用junit? 无论是编写简单的应用程序还是大型应用程序,我都使用语句对其进行测试,这对我来说很容易。 如果仍然需要调用相同的方法,检查它们返回的内容,然后又要为所有内容添加注释,那么为什么要使用JUnit创建测试类,在项目中创建不必要的文件夹呢? 为什么不编写一个类并立即对其进行测试而不创建Test-class? PS。我从未在刚刚
我有一个机器人可以把你排到一个寻欢作乐的人那里。当队列数达到2时,它将重置为0。我有两个命令,一个用于第一个人,另一个用于第二个人记录他们的名字。但是,当我将其设置为2时,它将转到queue=0,并在queue=0时激发命令,使其激发两次。 我怎样才能解决这个问题?