如何编写一个 bash 脚本来向所有用户的 X 显示器发送图形通知?

如何编写一个 bash 脚本来向所有用户的 X 显示器发送图形通知?

这是对这两个问题和答案的改进和更新请求(不是重复!):

我目前使用的是 Ubuntu 15.04,该命令who在根终端中运行时会给出如下输出,因为我的脚本将用作 cron 作业:


sadi     :0           2015-10-07 17:32 (:0)
root     pts/0        2015-10-07 19:55 (:0)

在研究了上面提到的问题和答案之后,我写了这些(稍作更新,但未完成)行:


#!/bin/bash
xuser=${who | grep -m1 ^.*\) | awk '{print $1}'}
xdisplay=${who | grep -m1 ^.*\) | awk '{print $5}' | sed 's/[(|)]//g'}
DISPLAY="$xdisplay" XAUTHORITY=/home/"$xuser"/.Xauthority su "$xuser" -c "notify-send 'Message'"

我想知道为什么这两个变量不起作用(给出bad substitution)...另外,为了使这个脚本适用于不同的(例如多用户)配置,我认为我应该考虑到可能还有其他用户。所以我想我需要创建一个循环,将每个用户及其 X 显示输入到最后一个命令,但作为 bash 脚本编写的初学者,我不知道如何...

在找到这个问题的答案之前,我正在使用如下的单用户脚本:


cuser="${SUDO_USER:-$USER}"
...
DISPLAY=:0 XAUTHORITY=/home/"$cuser"/.Xauthority su "$cuser" -c "notify-send 'Message'"

似乎该grep选项-m1也应该修改(以及替换${...}$(...)),因为它仅定义应从输出顶部捕获多少行。

who当还有访客会话(即多用户环境)时,再次在根终端中运行该命令会给出如下输出:


sadi     :0           2015-10-08 10:40 (:0)
guest-bAMpqo :1           2015-10-08 12:22 (:1)
root     pts/28       2015-10-08 12:43 (:0)
guest-bAMpqo pts/18       2015-10-08 12:25 (:1)

所以这应该给我一个 X 用户和 X 显示的名称列表:


#!/bin/bash
xusers=$(who | grep ' :[0-9]' | awk '{print $1}')
xdisplays=$(who | grep ' :[0-9]' | awk '{print $5}' | sed 's/[(|)]//g')
DISPLAY="$xdisplay" XAUTHORITY=/home/"$xuser"/.Xauthority su "$xuser" -c "notify-send 'Message'"

现在我需要修改最后一个命令以逐行捕获该列表。

答案1

最后,我自己在这个宝贵的知识数据库中搜索找到了答案StackExchange Unix 和 Linux!!!

除了上述问题的答案之外,我还使用了该问题的公认答案:读取两个文本文件,连接每一行

这是我上面问题的答案:

#!/bin/bash
xuser=$(who | grep ' \:[0-9]' | awk '{print $1}')
xdisplay=$(who | grep ' \:[0-9]' | awk '{print $5}' | sed 's/[(|)]//g')
echo "$xuser" > /tmp/xusers.txt
echo "$xdisplay" > /tmp/xdisplays.txt
while read -r -u3 xuser; read -r -u4 xdisplay; do
    DISPLAY="$xdisplay" XAUTHORITY=/home/"$xuser"/.Xauthority su "$xuser" -c "notify-send 'Message multi-user'"
done 3</tmp/xusers.txt 4</tmp/xdisplays.txt

相关内容