Bir bash betiğinde (.bashrc vb.) X oturumunu algılama


16

Geçenlerde xset b off.bashrc'ye koydum . Şimdi tty veya ssh, yani X oturumu dışında oturum açtığınızda ortaya çıkan hata beni rahatsız ediyor.

Aklıma gelen ilk şey, [[ -z "$SOME_VAR" ]] && xset b off(test değişkeninin boş kalmaya karşı boş olmanın farklı bir soru olduğu ortaya çıktı). Ama hangisi doğru olan SOME_VAR?

Bu yüzden hangi değişkenlerin X'te ayarlandığını setve tty'de seteksik olduğunu görmek için tty'nin çıktısını ve urxvt çıktısını ayırdım . Beklendiği gibi, oldukça fazla farklılık vardı (sadece benim için alakalı görünenleri listeliyor):

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

X oturumunda olup olmadığımı tespit etmek için hangisi test edilecek en doğru ve evrensel olan? Mümkün olduğunca çok dağıtım ve platformda ve masaüstü ortamında çalışabilecek bir şey mi var?

Yoksa ortam değişkenlerini test etmekten daha iyi bir yol var mı?

Yanıtlar:


8

Görüntü sunucunuzun kullanılabilir ve geçerli olduğunu sınamanın basit ve etkili bir yolu, onu sınamaktır xhost. DISPLAYGeçersiz bir değerle ayarlanabileceğinden , değişkente bir değeri kontrol etmeye her zaman güvenemezsiniz .

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

Bunu yapmamın nedeni crontab, mevcut olduğunda ekranda çalışan, ancak olmadığında farklı çalışan birkaç komut dosyası çalıştırmam . Üstümde, henüz mevcut olmasa bile değişkeni crontabayarladım . Bu ekranla başlayan komut dosyaları, ekranınız olsun veya olmasın başlayacaktır. Bu, ekranınızın aynı komut dosyasına geldiğinde ve içeri girdiğinde dinamik olarak algılamanıza olanak tanır.DISPLAY:0crontab@reboot

NOT: >&Sadece bash> = 4'te çalışır.> /dev/null 2>&1


Güzel, ayrıca test ssh -X; iyi çalışıyor!
Alois Mahdal

13

Kontrol DISPLAYetmenin en iyi yaklaşım olacağını düşünüyorum .

  • Uzak oturum açma işlemlerini gerçekleştirir (örn. Ssh -X).
  • Hepsi olmasa da çoğu platformda mevcuttur.
  • Pencere yöneticisi / DE'den bağımsızdır.

2
Ben de DISPLAYgenel olarak hata mesajı için gitmek veya basitçe bastırmak istiyorum . /dev/nullZaman zaman biraz sevgi ver .
frostschutz

3
@frostschutz Hayır, betiğin yalnızca ilgili bölümünü çalıştırmaya çalışıyorum. Hata mesajlarının bastırılması bu yönde herhangi bir adım atmaz. Aslında, potansiyel olarak kırılabilecek diğer şeyleri gidermek için ciddi karışıklığa neden olabilir.
Alois Mahdal

1
Cevaptan kısa bir süre sonra bu yaklaşımı kullanmaya başladım ve sshşimdiye kadar basit s ile mükemmel çalıştı , yapmaya başladığımda ssh -X--- görsel mod tarafından seçilen içerik yerel X panosuna ulaşmak için ssh üzerinde Vim'i kullanabilmek için sunucu tarafında xserver gerekmez . Bu nedenle DISPLAY, xserver ve xset olmasa bile iletmeyi etkinleştirmenin bir etkisi olarak ayarlanır.
Alois Mahdal


1
Kişisel DISPLAYdeğişken (bir komut kodlanma, veya değişken ayarlandı sonra X sunucusu kapatıldı zaman örneğin) aslında bir X sunucusunu çalıştıran olmayan bir ekrana işaret edebilir.
n.st

6

TERMDeğişkeni genellikle komut dosyalarımda X test etmek için kullanıyorum .

TERMGenellikle ayarlandığında linuxTTY ve xtermX'te
GNU Screen ve tmux gibi uygulamalar uğraşmak gibi görünüyor beri, burada "genellikle" sözcüğü kullanmak TERMDeğişken.


echo $TERMfarklı konsollarda makinenizdeki richt ayarını bulmaya çalışın . Kullandığım [ $TERM == "linux" ] && echo do some stuffUbuntu üzerinde
rubo77

3

Bu mükemmel bir şekilde çalışmalıdır:

[ ! -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.

Yani, bu false ( [ ! -t 0 ]) olarak değerlendirildiğinde GUI ortamındayız.


Bununla, ben yani hem X ve konsolda aynı sonucu almak [ -t 0 ]ve [ -t 1 ]ikisi de doğruysa.
Emanuel Berg

Garip, uzak bir ana bilgisayara ssh zaman benim için çalışıyor.
terdon

[ -t 0 ]Ubuntu'daki konsolda iyi çalışıyor (CTRL ALT F1 kullanarak)
rubo77

0

Bunu yapmanın birçok yolu var.

Bash'da deneyin

function xruns {
    if [[ `pstree -As $$ | grep xinit | wc -l` == 1 ]]; then
        echo "You are in X."
    else
        echo "You are not in X."
    fi
}

Veya zsh cinsinden deneyin

#!/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

Dikkat çekildi, ancak göndermeden önce kodunuzu test ediyor musunuz? Birincisi sözdizimi hatası var ve X oturumunda olup olmadığımızı gerçekten algılamıyor, bu nedenle echo 1X çalışıyorsa ve tty1-6 veya ssh ile giriş yaparsanız olur. Diğeri her zaman "X olmayan şeyler" yapar - Bence bu ${CURRENT_VT[6]}6. karakter yerine 6. satır anlamına gelir.
Alois Mahdal

@AloisMahdal: Aha, eşyalarım bash'da çalışmıyor (zsh kullanıyorum). Bunu düşünmedim. Eh, bunu zsh (type zsh) içinde deneyebilir ve bash'de çalışmasını sağlamak için isterseniz bazı değişiklikler yapabilirsiniz.
Emanuel Berg

@ AloisMdal: Tamam, değiştirdim. "Tty1-6 üzerinden oturum aç" söz konusu olduğunda, olduğu gibi, ben de bunu yapıyorum ve sonra ikinci çözümü (yukarıda) kullanıyorum ve bir değişken ayarlıyorum. Check out bu .zshrc ve aramak export VT. Değişkeni (zsh istemi için) hangi Linux VT / console / tty tutmak için kullanın, ancak X, ben sadece "X" (bir VT olmasa da) olarak ayarlayın. Ama bu detaylar, aynı prensibi kullanarak bash'da istediğiniz şekilde çalışabilirsiniz.
Emanuel Berg

Durumun bash sürümünü ikinci örneğe ekledim. Ancak, ilkinin hala yanlış olduğunu düşünüyorum. Belki ps baskı sadece ataları yardımcı olacaktır. Yine de bunun mümkün olup olmadığından emin değilim.
Alois Mahdal

@AloisMahdal: Düzenlemeye göz atın. Bunu benim için yapar, tty şeyler dahil.
Emanuel Berg

0

if [[ $DISPLAY ]]

Aynı bilgisayarda, $DISPLAYörneğin 0:0bir terminal emülatöründe dönecek , ancak gerçek bir terminalde hiçbir şey olmayacak . Bu, ile CtrlAltF1karşılaştırıldığında kolayca test edilebilir CtrlAltF7.

bashDayalı bir koşul $DISPLAYşöyle görünecektir:

if [[ $DISPLAY ]]; then 
  
fi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.