Terminal öykünücüsünün bir masaüstü oturumunda çalışıp çalışmadığını komut dosyası algılaması nasıl yapılır?


10

Ben bir metin dosyası yazmak, daha sonra bir düzenleyicide açmak çalıştırdığınız komut dosyaları var. Masaüstü oturumumda bir terminal öykünücü penceresi açar ve komut dosyasını çalıştırırsam, düzenleyicinin grafik gibi olmasını isterim gedit. Ancak, telefonumda ConnectBot veya benzeri bir cihazla giriş yapmışsam (masaüstü oturumu yok), editörün olmasını istiyorum nano.

Şu anda son adım hariç aynı 2 farklı komut dosyaları korumak zorunda (veya grafik bir çalışmasına izin, hata, sonra dosyayı el ile açın nano). Çoğunlukla aynı iki betiğe sahip olmak, bakım açısından verimsizdir.

Bir komut dosyası bu durumlardan hangisinde olduğumu algılayabilir ve doğru düzenleyiciyi açabilir mi?

(Bir komut dosyasının bir terminal öykünücü penceresinde çalıştığını veya çift tıklatıldığını algılaması için yollar buldum, ancak pencerenin masaüstünde çalışıp çalışmadığını tespit etmenin bir yolunu henüz bulamadım ... google için doğru terminolojiyi bilmek)


6
Betiğiniz başka kişiler tarafından kullanılacaksa, $EDITORvarsayılan olarak belirtilen programı yerine varsayılan olarak kullanmanız nanove nanoayarlanmamışsa yedeklemeyi kullanmanız gerekir.
Bakuriu

Teşekkürler, harika tavsiyeler ve iyi uygulamanın ne olduğunu duymak harika. Sadece ben.
Organik Mermer

Yanıtlar:


13

Ortam değişkenini $DISPLAYbir ifkoşulda tetikleyici olarak kullanabilirsiniz . Genellikle bu değişkenin bir değeri olduğunda grafik uygulamaları çalıştırabilirsiniz.

İşte bir örneği:

if [[ -z $DISPLAY ]]
then
    nano
else
    gedit
fi

-zEnvvar $DISPLAYboş olduğunda ve betiğiniz çalıştığında nano, diğer tüm durumlarda çalışacak şekilde operatör true değerini döndürür gedit.


@ Vurp0'ın bu yorumuna göre :

Çoğu modern Wayland masaüstünde (Fedora ve Ubuntu'daki varsayılan masaüstü gibi), $DISPLAYgeriye dönük uyumluluk (XWayland aracılığıyla) nedeniyle hala ayarlanmıştır, ancak daha sağlam bir komut dosyası için her ikisini de test etmek $DISPLAYve $WAYLAND_DISPLAYemin olmak iyi olacaktır .

Test ifadesini aşağıdaki şekilde değiştirmenizi öneririm:

[[ -z ${DISPLAY}${WAYLAND_DISPLAY} ]]

Böylece, iki değişkenin değerleri, operatör tarafından işlenecek ortak bir dizgiye birleştirilecektir -z.


Referanslar:


1
Veya açık mantık için:[[ -z ${DISPLAY} && -z ${WAYLAND_DISPLAY} ]]
sonraki duyuruya kadar duraklatıldı.

7

Genellikle sanal terminaller /dev/ptssözde terminaller kullanır . Bu nedenle, ttykomutun çıktısına dayanarak, casebelirli bir düzenleyiciyi açmaya yönelik basit bir ifade oluşturabiliriz:

case "$(tty)" in ; "/dev/pts"*) nano ;; "/dev/tty"*) gedit ;; ;esac

Veya daha güzel biçimlendirilmiş:

case "$(tty)" in
    "/dev/pts"*) gedit ;; 
    "/dev/tty"*) nano ;;
    *) echo "Not suitable tty" > /dev/stderr ;;
esac

Ortam değişkenlerini kullanmaya kıyasla, bu biraz daha güvenilir ve biraz daha taşınabilir komutlu casedeyimi kullandığını düşünüyor tty. Muhtemelen en iyi şey, her ikisini birden gibi ekstra testlerle birleştirmektir."/dev/tty"*) [ -n "$DISPLAY" ] && gedit ;;


Bu yanlış bir yol değil mi? Benim Ctrl + Alt + F1 konsolunda, ttyverir /dev/tty1, oysa gnome-terminal(ilk sekmesi) verir /dev/pts/0.
Paddy Landau

@PaddyLandau Evet, durum böyle geditolmalıdır /dev/pts*. Hata testini tty'de yaparken değiştirdim ve geri dönmeden buraya kopyaladım. Teşekkürler, zaten düzenlendi.
Sergiy Kolodyazhnyy

3

Ben ne kullanıyorum:

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    notify-send --urgency=critical "$0 cannot be run from GUI without TERM environment variable."
    exit 1
fi

Bu kodun nedeni şu soruydu: Bash betiğinin masaüstü kısayolu çöküyor ve yanıyor

Aşağıdaki gibi değiştirebilirsiniz:

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    nano ...
else
    gedit ...
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.