用于访问互联网时通知的Bash脚本

naw*_*bgh 7 bash shell terminal-emulator

我写了这个bash脚本,以便在互联网变得可访问时发出通知,但我不了解许多正在发生的事情.这是脚本:

while ! ping 8.8.8.8 -c 1 2&> /dev/null ; do true; done;
Run Code Online (Sandbox Code Playgroud)
  • -c 1选项告诉ping我只想发送一个数据包.
  • 2&> /dev/null是因为我不想看到输出.
  • true是因为bash不接受do;语法.
  • 终止条件是! ping ...因为ping在某些数据包之前没有收到数据包时返回非零状态代码timeout.

预期的行为是在ping成功结束时此循环结束,终端仿真器将自动向我发送通知.


问题

  • 即使可以访问Internet,此命令也不会结束.
  • 试图杀死命令ctrl + C不起作用.我认为它会杀死子命令ping而不是整个命令.
  • 2&> /dev/null除了将输出写入终端的次要问题之外,只有删除才能使所有事情都有效.

问题

  1. 我的命令出了什么问题?
  2. 终端仿真器究竟是如何做出反应的ctrl + C
  3. 为什么删除2&> /dev/null使它工作?

请注意,我已经有了转机.不过我还想了解bash一点.

f() { while ! ping 8.8.8.8 -c 1 ; do true; done; }; f 2&> /dev/null
Run Code Online (Sandbox Code Playgroud)

che*_*ner 8

正确的重定向运算符&>不是2&>.2被解析为一个单独的参数ping,并且由于ping 2不会成功,所以循环永远不存在.