我写了这个bash脚本,以便在互联网变得可访问时发出通知,但我不了解许多正在发生的事情.这是脚本:
while ! ping 8.8.8.8 -c 1 2&> /dev/null ; do true; done;
> -c 1选项告诉ping我只想发送一个数据包.
> 2&> / dev / null是因为我不想看到输出.
>是的,因为bash不接受这样做;句法.
>终止条件是! ping …因为在一些超时之前没有收到数据包时ping返回非零状态代码.
当ping成功并且终端模拟器将自动向我发送通知时,预期的行为是此循环结束.
问题
>即使可以访问Internet,此命令也不会结束.
>尝试使用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永远不会成功,所以循环永远不存在.