%20%E3%81%A7%20X%20%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E6%A4%9C%E5%87%BA%E3%81%99%E3%82%8B.png)
最近、xset b off
.bashrc に追加しました。tty または ssh 経由でログインするとき、つまり X セッションの外部でエラーが表示されて困っています。
最初に頭に浮かんだのは[[ -z "$SOME_VAR" ]] && xset b off
(まあ、テストは変数が設定されている vs. 空であるは別の質問です。しかし、どの SOME_VAR が正しいのでしょうか?
set
そこで、tty の出力と 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 セッション中かどうかを検出するためにテストするのに最も正確で汎用的な方法はどれですか? できるだけ多くのディストリビューション、プラットフォーム、デスクトップ環境で機能するものはどれですか?
または、環境変数をテストするよりもさらに良い方法はありますか?
答え1
ディスプレイ サーバーが利用可能で有効かどうかをテストする簡単で効果的な方法は、 を使用してテストすることですxhost
。無効な値が設定されている可能性もあるため、変数の値のチェックに常に頼ることはできませんDISPLAY
。
if xhost >& /dev/null ; then echo "Display exists"
else echo "Display invalid" ; fi
私がこのようにする理由は、ディスプレイcrontab
が存在する場合はディスプレイ上で動作し、存在しない場合は異なる動作をするスクリプトをユーザー 内でいくつか実行しているからです。 の先頭で、まだ存在しないにもかかわらず、変数を にcrontab
設定しています。で始まる内のスクリプトは、ディスプレイの有無に関係なく開始されます。これにより、同じスクリプト内でディスプレイが表示されたり消えたりすることを動的に検出できます。DISPLAY
:0
crontab
@reboot
注意: は4以上>&
でのみ動作します。それ以外の場合はbash
> /dev/null 2>&1
答え2
DISPLAY
確認するのが最善の方法だと思います。
- リモート ログイン (例: ssh -X) を処理します。
- すべてではないにしても、ほとんどのプラットフォームで利用可能です。
- ウィンドウマネージャ/DE から独立しています。
答え3
私は通常、TERM
スクリプト内で X をテストするために変数を使用します。
TERM
linux
は、通常、TTY およびxterm
X ではに設定されます。
ここで「通常」という言葉を使用するのは、GNU Screen や TMux などのアプリケーションが変数を混乱させる可能性があるためですTERM
。
答え4
通常の bash スクリプトの場合:if [[ $DISPLAY ]]
同じコンピュータ上で、$DISPLAY
たとえば0:0
ターミナル エミュレータでは が返されますが、実際のターミナルでは何も返されません。これは、CtrlAltF1versusで簡単にテストできますCtrlAltF7。
bash
に基づく条件は次$DISPLAY
のようになります。
if [[ $DISPLAY ]]; then
…
fi
または:.profile
.personal
if xhost >& /dev/null
私の経験から言うと、、あるいは拡張して が実行された$DISPLAY
時点では はまだ設定されていません。そのような場合、.profile
.personal
ユーザーの回答 cmevoli
最も適したもの:
if xhost >& /dev/null; then
fi
デスクトップを定義するときにこの問題に遭遇しましたCapsLock キーマッピングそれは私のサーバーには適用されないはずです。