我编写了这个 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
如果在timeout
之前没有收到数据包,则返回非零状态码.
此循环的预期行为是在 ping
时结束。成功,终端仿真器会自动向我发送通知。
问题
- 即使可以访问互联网,此命令也不会结束。
- 试图用
ctrl + C
终止命令不起作用。我认为它正在杀死子命令ping
而不是整个命令。 - 仅删除
2&> /dev/null
使一切正常,除了将输出写入终端的小问题。
问题
- 我的命令有什么问题?
- 终端仿真器究竟如何对
ctrl + C
作出 react ? ? - 为什么删除
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
永远不会成功,因此循环永远不存在。
关于可访问互联网时用于通知的 Bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33873430/