
最近我把它放到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 和xterm
X 上。TERM
答案4
在普通的 bash 腳本中:if [[ $DISPLAY ]]
在同一台電腦上,$DISPLAY
將在終端模擬器中返回0:0
,但在真實終端中不會返回任何內容。這可以很容易地用CtrlAltF1vs進行測試CtrlAltF7。
bash
基於的條件如下$DISPLAY
:
if [[ $DISPLAY ]]; then
…
fi
在.profile
或.personal
:if xhost >& /dev/null
根據我的經驗,在執行或擴展$DISPLAY
時尚未設定。對於這些情況,.profile
.personal
用戶回答 cmevoli
服務最好:
if xhost >& /dev/null; then
fi