Bagaimana agar skrip mendeteksi apakah terminal emulator sedang berjalan di sesi desktop atau tidak?

10

Saya memiliki skrip yang saya jalankan yang menulis file teks, lalu membukanya di editor. Jika saya membuka jendela terminal emulator di sesi desktop saya dan menjalankan skrip, saya ingin editor menjadi seperti grafis gedit. Tetapi, jika saya login melalui ConnectBot di ponsel saya atau yang serupa (tidak ada sesi desktop), saya ingin menjadi editor nano.

Saat ini saya harus memelihara 2 skrip yang berbeda, identik kecuali untuk langkah terakhir (atau biarkan satu grafis berjalan, galat, lalu buka file secara manual nano). Memiliki dua skrip yang hampir sama tidak efisien dari sudut pandang pemeliharaan.

Bisakah skrip mendeteksi dari situasi mana saya berada, dan membuka editor yang benar?

(Saya telah menemukan cara skrip untuk mendeteksi apakah skrip berjalan di jendela terminal emulator atau diklik dua kali, tetapi belum menemukan cara untuk mendeteksi apakah jendela tersebut berjalan di desktop ... Saya tidak berpikir saya tahu terminologi yang benar ke google untuk)

Marmer organik
sumber
6
Jika skrip Anda digunakan oleh orang lain, Anda harus menggunakan program yang ditentukan $EDITORsecara default alih-alih nano, dan mundur nanojika tidak disetel.
Bakuriu
Terima kasih, saran yang bagus, dan senang mendengar apa yang merupakan praktik yang baik. Hanya saya saja.
Marmer Organik

Jawaban:

13

Anda dapat menggunakan variabel lingkungan $DISPLAYsebagai pemicu dalam suatu ifkondisi. Biasanya ketika variabel ini memiliki nilai Anda dapat menjalankan aplikasi grafis.

Berikut ini adalah contoh :

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

Operator -zakan mengembalikan true ketika envvar $DISPLAYkosong dan skrip Anda akan berjalan nano, dalam semua kasus lain itu akan berjalan gedit.


Menurut komentar @ vurp0 ini :

Pada sebagian besar desktop Wayland modern (seperti desktop default di Fedora dan Ubuntu), $DISPLAYmasih ditetapkan karena kompatibilitas ke belakang (melalui XWayland), tetapi untuk skrip yang lebih kuat akan lebih baik untuk menguji keduanya $DISPLAYdan $WAYLAND_DISPLAYuntuk memastikan.

Saya akan menyarankan untuk memodifikasi ekspresi tes dengan cara berikut:

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

Dengan demikian, nilai-nilai dari dua variabel akan digabungkan menjadi string yang sama, yang akan diproses oleh operator -z.


Referensi:

pa4080
sumber
1
Atau untuk logika eksplisit:[[ -z ${DISPLAY} && -z ${WAYLAND_DISPLAY} ]]
Dijeda hingga pemberitahuan lebih lanjut.
7

Biasanya terminal virtual menggunakan /dev/ptspseudo-terminal . Jadi, berdasarkan output dari ttyperintah, kita dapat membangun casepernyataan sederhana untuk menangani pembukaan editor tertentu:

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

Atau diformat lebih baik:

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

Dibandingkan dengan menggunakan variabel lingkungan, ini sedikit lebih dapat diandalkan dan mempertimbangkan menggunakan casepernyataan dengan ttyperintah yang sedikit lebih portabel. Yang mungkin paling baik adalah menggabungkan keduanya, dengan pengujian ekstra, seperti"/dev/tty"*) [ -n "$DISPLAY" ] && gedit ;;

Sergiy Kolodyazhnyy
sumber
Bukankah ini cara yang salah? Pada konsol Ctrl + Alt + F1 saya, ttyberi /dev/tty1, sedangkan gnome-terminal(tab pertama) memberi /dev/pts/0.
Paddy Landau
@ PaddyLandau Ya, geditharus /dev/pts*berjaga-jaga. Saya beralih sekitar saat pengujian kesalahan dalam tty dan akhirnya menyalinnya di sini tanpa beralih kembali. Terima kasih, sudah diedit.
Sergiy Kolodyazhnyy
3

Inilah yang saya gunakan:

# $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

Alasan untuk kode ini adalah pertanyaan ini: Pintasan desktop ke skrip Bash lumpuh dan terbakar

Anda dapat memodifikasinya agar terlihat seperti ini:

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    nano ...
else
    gedit ...
fi
WinEunuuchs2Unix
sumber