这是对这两个问题和答案的改进和更新请求(不是重复!):
我目前使用的是 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