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)
sumber
$EDITOR
secara default alih-alihnano
, dan mundurnano
jika tidak disetel.Jawaban:
Anda dapat menggunakan variabel lingkungan
$DISPLAY
sebagai pemicu dalam suatuif
kondisi. Biasanya ketika variabel ini memiliki nilai Anda dapat menjalankan aplikasi grafis.Berikut ini adalah contoh bash :
Operator
-z
akan mengembalikan true ketika envvar$DISPLAY
kosong dan skrip Anda akan berjalannano
, dalam semua kasus lain itu akan berjalangedit
.Menurut komentar @ vurp0 ini :
Saya akan menyarankan untuk memodifikasi ekspresi tes dengan cara berikut:
Dengan demikian, nilai-nilai dari dua variabel akan digabungkan menjadi string yang sama, yang akan diproses oleh operator
-z
.Referensi:
sumber
[[ -z ${DISPLAY} && -z ${WAYLAND_DISPLAY} ]]
Biasanya terminal virtual menggunakan
/dev/pts
pseudo-terminal . Jadi, berdasarkan output daritty
perintah, kita dapat membanguncase
pernyataan sederhana untuk menangani pembukaan editor tertentu:Atau diformat lebih baik:
Dibandingkan dengan menggunakan variabel lingkungan, ini sedikit lebih dapat diandalkan dan mempertimbangkan menggunakan
case
pernyataan dengantty
perintah yang sedikit lebih portabel. Yang mungkin paling baik adalah menggabungkan keduanya, dengan pengujian ekstra, seperti"/dev/tty"*) [ -n "$DISPLAY" ] && gedit ;;
sumber
tty
beri/dev/tty1
, sedangkangnome-terminal
(tab pertama) memberi/dev/pts/0
.gedit
harus/dev/pts*
berjaga-jaga. Saya beralih sekitar saat pengujian kesalahan dalam tty dan akhirnya menyalinnya di sini tanpa beralih kembali. Terima kasih, sudah diedit.Inilah yang saya gunakan:
Alasan untuk kode ini adalah pertanyaan ini: Pintasan desktop ke skrip Bash lumpuh dan terbakar
Anda dapat memodifikasinya agar terlihat seperti ini:
sumber