web-dev-qa-db-ja.com

bashスクリプト(.bashrcなど)でのXセッションの検出

最近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セッションかどうかを検出するためにテストする最も正確で普遍的なものはどれですか。できるだけ多くのディストリビューション、プラットフォーム、デスクトップ環境で機能するものはありますか?

または、環境変数をテストするよりも良い方法はありますか?

16
Alois Mahdal

ディスプレイサーバーが利用可能で有効であることをテストする簡単で効果的な方法は、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を使用します

8
cmevoli

DISPLAYをチェックするのが最善の方法だと思います。

  • リモートログインを処理します(ssh -Xなど)。
  • すべてではないにしても、ほとんどのプラットフォームで使用できます。
  • ウィンドウマネージャー/ DEから独立しています。
13
Renan

私は通常、スクリプトでXをテストするためにTERM変数を使用します。

TERMは通常、TTYではlinuxに、Xではxtermに設定されます。
GNU ScreenやTMuxなどのアプリケーションはTERM変数を混乱させるように見えるので、ここでは「通常」という言葉を使用します。

6
darnir

これは完全にうまくいくはずです:

[ ! -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環境にいます。

3
terdon

あなたがそれを行うことができる多くの方法があります。

バッシュで、試してみてください

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
0
Emanuel Berg

if [[ $DISPLAY ]]

同じコンピュータでは、$DISPLAYは、たとえばターミナルエミュレータでは0:0を返しますが、実際の端末では何も返しません。これは簡単にテストできます CtrlAltF1 対 CtrlAltF7

$DISPLAYに基づくbash条件は次のようになります。

if [[ $DISPLAY ]]; then 
  …
fi
0