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

标签 bash shell terminal-emulator

我编写了这个 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使一切正常,除了将输出写入终端的小问题。

问题

  1. 我的命令有什么问题?
  2. 终端仿真器究竟如何对 ctrl + C 作出 react ? ?
  3. 为什么删除 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/

相关文章:

regex - 将通用正则表达式转换为 bash 证明正则表达式

Bash:在循环中从 STDIN 读取奇怪的行为

linux - 从shell脚本中的目录获取文件名

terminal-emulator - 如何关闭滚动字符

qt - 我如何从 Qt 获取 Ubuntu 终端列表

python - 在 PyGtk GUI 中嵌入交互式 shell (VTE) 以操作其自己的小部件

linux - 如何检测文件何时来自 bash

linux - 删除空字符(Shell 脚本)

arrays - Bash 获取唯一元素并过滤值

linux - 如何在perl中创建依赖进程