在 bash 腳本(.bashrc 等)中偵測 X 會話

在 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 會話中,哪一個是最正確、最通用的測試方法?可以跨盡可能多的發行版、平台和桌面環境運作的東西嗎?

或者有比測試環境變數更好的方法嗎?

答案1

測試顯示伺服器是否可用且有效的一種簡單有效的方法是使用xhost.您不能總是依賴檢查變數中的值,DISPLAY因為它可能設定為無效值。

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

我這樣做的原因是因為我在我的用戶中運行了幾個腳本,crontab當顯示器存在時,這些腳本在顯示器上運行,但當顯示器不存在時,它們的工作方式不同。在 my 的頂部crontab,我將DISPLAY變數設為,:0即使它尚不存在。無論您是否有顯示器,crontab以 開頭的腳本都會啟動。@reboot這將允許您在同一腳本中動態檢測顯示何時出現和消失。

注意:>&僅適用於bash>= 4。> /dev/null 2>&1

答案2

我認為檢查DISPLAY是最好的方法。

  • 它處理遠端登入(例如 ssh -X)。
  • 它適用於大多數(如果不是全部)平台。
  • 它獨立於視窗管理器/DE。

答案3

我通常使用該TERM變數來測試腳本中的 X。

TERM 通常設定為linux在 TTY 和xtermX 上。
TERM

答案4

在普通的 bash 腳本中:if [[ $DISPLAY ]]

在同一台電腦上,$DISPLAY將在終端模擬器中返回0:0,但在真實終端中不會返回任何內容。這可以很容易地用CtrlAltF1vs進行測試CtrlAltF7

bash基於的條件如下$DISPLAY

if [[ $DISPLAY ]]; then 
fi

.profile.personalif xhost >& /dev/null

根據我的經驗,在執行或擴展$DISPLAY時尚未設定。對於這些情況,.profile.personal用戶回答 cmevoli服務最好:

if xhost >& /dev/null; then
fi

我在定義桌面時遇到了這個問題CapsLock 鍵映射這不應該適用於我的伺服器。

相關內容