最近xset b off
を.bashrcに追加します。 ttyまたはsshを介して、つまりXセッション外でログインすると、ポップアップが表示されるというエラーが発生します。
最初に頭に浮かんだのは[[ -z "$SOME_VAR" ]] && xset b off
(まあ、テスト 変数の設定と空の設定 は別の質問です)。しかし、正しいSOME_VARはどれですか。
そのため、ttyのset
出力とurxvtのset
出力を比較して、Xで設定され、ttyで欠落している変数を確認しました。予想通り、かなり多くの違いがありました(私に関係があると思われるものだけをリストします):
DESKTOP_SESSION
DISPLAY
GDMSESSION
SESSION_MANAGER
WINDOWID
WINDOWPATH
XAUTHORITY
XDG_SESSION_COOKIE
XDG_CONFIG_DIRS
XDG_DATA_DIRS
XDG_MENU_PREFIX
Xセッションかどうかを検出するためにテストする最も正確で普遍的なものはどれですか。できるだけ多くのディストリビューション、プラットフォーム、デスクトップ環境で機能するものはありますか?
または、環境変数をテストするよりも良い方法はありますか?
ディスプレイサーバーが利用可能で有効であることをテストする簡単で効果的な方法は、xhost
を使用してテストすることです。 DISPLAY
変数には無効な値が設定されている可能性があるため、変数の値のチェックに常に依存することはできません。
if xhost >& /dev/null ; then echo "Display exists"
else echo "Display invalid" ; fi
私がこれを行う理由は、ユーザーcrontab
でいくつかのスクリプトを実行するためです。スクリプトが存在する場合は画面上で動作しますが、存在しない場合は動作が異なります。 crontab
の上部で、DISPLAY
変数がまだ存在しない場合でも、:0
に設定します。 crontab
内の@reboot
で始まるスクリプトは、ディスプレイの有無に関係なく開始されます。これにより、同じスクリプト内でディスプレイが表示されるタイミングと動的に表示されるタイミングを動的に検出できます。
注:>&
はbash
> = 4でのみ機能します。それ以外の場合は> /dev/null 2>&1
を使用します
DISPLAY
をチェックするのが最善の方法だと思います。
私は通常、スクリプトでXをテストするためにTERM
変数を使用します。
TERM
は通常、TTYではlinux
に、Xではxterm
に設定されます。
GNU ScreenやTMuxなどのアプリケーションはTERM
変数を混乱させるように見えるので、ここでは「通常」という言葉を使用します。
これは完全にうまくいくはずです:
[ ! -t 0 ] && xset b off
http://tldp.org/LDP/abs/html/fto.html
-t
file (descriptor) is associated with a terminal device
This test option may be used to check whether the stdin [ -t 0 ]
or stdout [ -t 1 ] in a given script is a terminal.
したがって、これがfalse([ ! -t 0 ]
)GUI環境にいます。
あなたがそれを行うことができる多くの方法があります。
バッシュで、試してみてください
function xruns {
if [[ `pstree -As $$ | grep xinit | wc -l` == 1 ]]; then
echo "You are in X."
else
echo "You are not in X."
fi
}
または、zshで試してください
#!/usr/bin/zsh
CURRENT_VT=`tty`
if [[ ${CURRENT_VT[6]} == "p" ]]; # or `${CURRENT_VT:5:1}` in bash
then
# X stuff
else
# non-X stuff
fi
if [[ $DISPLAY ]]
同じコンピュータでは、$DISPLAY
は、たとえばターミナルエミュレータでは0:0
を返しますが、実際の端末では何も返しません。これは簡単にテストできます CtrlAltF1 対 CtrlAltF7。
$DISPLAY
に基づくbash
条件は次のようになります。
if [[ $DISPLAY ]]; then
…
fi