これは質問と回答の両方に対する改善と更新の要求です(重複ではありません!)。
私は現在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'"
なぜこれらの2つの変数が機能しないのか疑問に思う(与えられた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行ずつキャプチャするように最後のコマンドを変更する必要があります。
答え1
最後に、私はこの貴重な知識データベースを直接検索して答えを見つけました。StackExchange UnixとLinux!!!
上記の質問に対する回答に加えて、この質問に対する回答も使用しました。2つのテキストファイルを読み、各行をリンクします。
上記の質問に対する答えは次のとおりです。
#!/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