如何添加到此命令以通过新终端弹出“通知”弹出消息?

时间:2014-12-01 14:29:45

标签: linux bash watch

我通过脚本使用此命令:

watch "who | egrep -i 'user1|user2|user3'"

我正试图让这个新终端弹出并说:

"用户已登录"

我想在后台运行所有内容"&"但作为命令登录中的一个用户,我希望此脚本弹出一个新终端,并说该用户已登录。

我希望它只在他们登录时发生,如果他们退出并重新登录它。

我理解如果我在前台运行初始命令我可以看到我的" custom"用户列表每2秒登录和关闭但是我希望在后台运行它并让新终端弹出登录的特定用户。

我很抱歉重复自己,但我想尽可能具体。

1 个答案:

答案 0 :(得分:1)

watch很适合观看命令输出,但不能处理它。

我建议使用循环,在迭代之间保存输出并检查diff。有人这样想:

last_output=$(tempfile)
output=$(tempfile)

while true; do
  who | egrep -i 'user1|user2|user3' > $output

  # check for new users logged
  new_users=$(diff $last_output $output | grep '>' | cut -d ' ' -f 2)

  # if there is some, throw a notification
  if [ -n "$new_users" ]; then
    xterm -e "echo -e 'New users logged:\n$new_users'; read -n 1" &
  fi

  # we save the output
  mv $output $last_output

  sleep 2
done

这里我使用xterm来发送通知,但您可以使用其他工具,例如libnotify(提供notify-send)。并且因为xterm在执行完命令时停止,所以我添加了等待输入的read -n 1命令,但您可以使用sleep使通知在没有用户交互的情况下消失。

修改

要从文件中读取要监视的用户列表,您可以使用类似的内容(每行包含一个用户的文件):

regex=$(tr '\n' '|' < path/to/file)
regex=${regex%?} # to remove the last '|'