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

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

最近、xset b off.bashrc に追加しました。tty または ssh 経由でログインするとき、つまり X セッションの外部でエラーが表示されて困っています。

最初に頭に浮かんだのは[[ -z "$SOME_VAR" ]] && xset b off(まあ、テストは変数が設定されている vs. 空であるは別の質問です。しかし、どの SOME_VAR が正しいのでしょうか?

setそこで、tty の出力と urxvt の出力を比較して、setX で設定されている変数と tty で設定されていない変数を確認しました。予想どおり、かなり多くの違いがありました (関連性があると思われるもののみをリストします)。

  • DESKTOP_SESSION
  • DISPLAY
  • GDMSESSION
  • SESSION_MANAGER
  • WINDOWID
  • WINDOWPATH
  • XAUTHORITY
  • XDG_SESSION_COOKIE
  • XDG_CONFIG_DIRS
  • XDG_DATA_DIRS
  • XDG_MENU_PREFIX

X セッション中かどうかを検出するためにテストするのに最も正確で汎用的な方法はどれですか? できるだけ多くのディストリビューション、プラットフォーム、デスクトップ環境で機能するものはどれですか?

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

答え1

ディスプレイ サーバーが利用可能で有効かどうかをテストする簡単で効果的な方法は、 を使用してテストすることですxhost。無効な値が設定されている可能性もあるため、変数の値のチェックに常に頼ることはできませんDISPLAY

if xhost >& /dev/null ; then echo "Display exists"
else echo "Display invalid" ; fi

私がこのようにする理由は、ディスプレイcrontabが存在する場合はディスプレイ上で動作し、存在しない場合は異なる動作をするスクリプトをユーザー 内でいくつか実行しているからです。 の先頭で、まだ存在しないにもかかわらず、変数を にcrontab設定しています。で始まる内のスクリプトは、ディスプレイの有無に関係なく開始されます。これにより、同じスクリプト内でディスプレイが表示されたり消えたりすることを動的に検出できます。DISPLAY:0crontab@reboot

注意: は4以上>&でのみ動作します。それ以外の場合はbash> /dev/null 2>&1

答え2

DISPLAY確認するのが最善の方法だと思います。

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

答え3

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

TERMlinuxは、通常、TTY およびxtermX ではに設定されます。
ここで「通常」という言葉を使用するのは、GNU Screen や TMux などのアプリケーションが変数を混乱させる可能性があるためですTERM

答え4

通常の bash スクリプトの場合:if [[ $DISPLAY ]]

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

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

if [[ $DISPLAY ]]; then 
fi

または:.profile.personalif xhost >& /dev/null

私の経験から言うと、、あるいは拡張して が実行された$DISPLAY時点では はまだ設定されていません。そのような場合、.profile.personalユーザーの回答 cmevoli最も適したもの:

if xhost >& /dev/null; then
fi

デスクトップを定義するときにこの問題に遭遇しましたCapsLock キーマッピングそれは私のサーバーには適用されないはずです。

関連情報