Bash 可访问互联网时的通知脚本
Bash script for notification when internet is accessible
我编写了这个 bash 脚本,以便在可以访问互联网时收到通知,但我不了解正在发生的许多事情。这是脚本:
while ! ping 8.8.8.8 -c 1 2&> /dev/null ; do true; done;
-c 1
选项告诉ping
我只想发送一个数据包。
-
2&> /dev/null
在那里是因为我不想看到输出。
true
在那里是因为 bash
不接受 do;
语法。
- 终止条件是
! ping ...
因为ping
returns 在timeout
. 之前没有收到数据包时非零状态码
预期的行为是在 ping
成功时结束此循环,并且终端仿真器会自动向我发送通知。
问题
- 即使可以访问互联网,此命令也不会结束。
- 尝试用
ctrl + C
终止命令是行不通的。我认为它正在杀死子命令 ping
而不是整个命令。
- 只有删除
2&> /dev/null
才能使一切正常,除了将输出写入终端的小问题。
问题
- 我的命令有什么问题?
- 终端仿真器对
ctrl + C
的反应究竟如何?
- 为什么删除
2&> /dev/null
会起作用?
请注意,我已经有了转机。不过还是想多了解一下bash
f() { while ! ping 8.8.8.8 -c 1 ; do true; done; }; f 2&> /dev/null
正确的重定向运算符是 &>
,而不是 2&>
。 2 被解析为 ping
的单独参数,并且由于 ping 2
永远不会成功,因此循环永远不存在。
我通常在那种循环中做的事情是添加一个 sleep
命令而不是 true
:
while ! ping 8.8.8.8 -c 1 &> /dev/null ; do sleep 1; done;
这样你就可以在睡眠中使用Ctrl+C
并取消整个循环。
我认为更好的方法是在 ping 中设置超时。
while ! ping -c 1 -W 2 8.8.8.8 >/dev/null 2>&1 ; do sleep 1 ; done
我编写了这个 bash 脚本,以便在可以访问互联网时收到通知,但我不了解正在发生的许多事情。这是脚本:
while ! ping 8.8.8.8 -c 1 2&> /dev/null ; do true; done;
-c 1
选项告诉ping
我只想发送一个数据包。-
2&> /dev/null
在那里是因为我不想看到输出。 true
在那里是因为bash
不接受do;
语法。- 终止条件是
! ping ...
因为ping
returns 在timeout
. 之前没有收到数据包时非零状态码
预期的行为是在 ping
成功时结束此循环,并且终端仿真器会自动向我发送通知。
问题
- 即使可以访问互联网,此命令也不会结束。
- 尝试用
ctrl + C
终止命令是行不通的。我认为它正在杀死子命令ping
而不是整个命令。 - 只有删除
2&> /dev/null
才能使一切正常,除了将输出写入终端的小问题。
问题
- 我的命令有什么问题?
- 终端仿真器对
ctrl + C
的反应究竟如何? - 为什么删除
2&> /dev/null
会起作用?
请注意,我已经有了转机。不过还是想多了解一下bash
f() { while ! ping 8.8.8.8 -c 1 ; do true; done; }; f 2&> /dev/null
正确的重定向运算符是 &>
,而不是 2&>
。 2 被解析为 ping
的单独参数,并且由于 ping 2
永远不会成功,因此循环永远不存在。
我通常在那种循环中做的事情是添加一个 sleep
命令而不是 true
:
while ! ping 8.8.8.8 -c 1 &> /dev/null ; do sleep 1; done;
这样你就可以在睡眠中使用Ctrl+C
并取消整个循环。
我认为更好的方法是在 ping 中设置超时。
while ! ping -c 1 -W 2 8.8.8.8 >/dev/null 2>&1 ; do sleep 1 ; done