所以我不得不自己做错误处理并遇到问题,下面的代码导致问题。
sbalert -t "Checking" -m "Checking for updates please wait" -d "" &
alert_id="$!"
ping -c 1 repod00r.com || kill $alert_id && sbalert -t "Connection error" -m "Unable to connect to the update server." && exit
每当ping 成功或失败时,我都会抛出错误处理程序,一旦我关闭sbalert
,sbalert -t "Checking" -m "Checking for updates please wait" -d ""
会在屏幕上重新显示它应该被杀死。
我已经尝试重新排序错误处理的三个部分来尝试修复此问题。但无济于事......
我有点像菜鸟,很抱歉,如果答案正在打击我......
答案 0 :(得分:1)
在bash中,连接器||
和&&
只是从左到右执行。 ||
没有更高的优先级。
试试看它的工作原理:
true || echo 1 && echo 2
false || echo 1 && echo 2
false || false && echo 1 && echo 2
所以当你这样做时:(简化)
ping || kill $alert_id && sbalert && exit
kill
仅在ping
失败时执行,但如果sbalert
或ping
成功,则kill
会执行,exit
如果sbalert
已执行并成功,则执行。
因此,如果ping
成功,第二个sbalert
将会执行,但原始sbalert
将不会被杀死,这似乎就是您所遇到的。
使用if
语句更容易阅读和编写代码:
sbalert -t "Checking" -m "Checking for updates please wait" -d "" &
alert_id=$!
if ! ping -c 1 repod00r.com; then
kill $alert_id
sbalert -t "Connection error" -m "Unable to connect to the update server."
exit
fi
答案 1 :(得分:1)
如果ping 或,则第二个sbalert
会触发。
Shell &&
和||
不是三元运算符。
当shell看到a || b && c
时,如果您希望它为(a || b) && c
,则会将其解释为a || (b && c)
。
明确地对命令进行分组(例如a || { b && c; }
)或使用明确的if
。