Keluar dari terminal setelah menjalankan skrip bash

Saya mencoba menulis skrip bash untuk membuka file-file tertentu (kebanyakan file pdf) menggunakan perintah gnome-open. Saya juga ingin terminal keluar setelah membuka file pdf.

Saya telah mencoba menambahkan exit ke akhir skrip saya namun itu tidak menutup terminal. Saya mencoba mencari jawaban online untuk pertanyaan saya tetapi saya tidak dapat menemukan jawaban yang tepat, saya akan sangat menghargai jika kalian dapat membantu.

Saya membutuhkan jawaban yang hanya membunuh terminal dari mana saya menjalankan perintah, bukan semua terminal, apakah ini mungkin? Jawaban sebelumnya yang saya terima akan membunuh semua jendela terminal yang terbuka. Saya tidak menyadari hal ini sampai hari ini.

Larutan

Jika Anda hanya membuka satu berkas, Anda tidak perlu menggunakan skrip, karena skrip dimaksudkan sebagai cara mudah untuk menjalankan beberapa perintah secara berurutan, sementara di sini Anda hanya perlu menjalankan dua perintah (termasuk exit).

Jika anda ingin menjalankan exit setelah sebuah perintah atau setelah rangkaian perintah, anda dapat merangkaikannya dengan apa yang telah anda miliki dengan menggunakan operator && (yang jika perintah sebelumnya berhasil/rangkaian perintah akan menjalankan perintah berikutnya) atau dengan menggunakan operator ; (yang jika perintah sebelumnya berhasil dan gagal akan menjalankan perintah berikutnya).

Dalam hal ini akan menjadi seperti itu:

gnome-open <path_to_pdf_File> && exit

*<path_to_pfd_File> = path dari file pdf

exit yang diletakkan di akhir skrip tidak berfungsi karena hanya keluar dari instance bash di mana skrip dijalankan, yang merupakan instance bash yang lain dari instance bash dalam Terminal.

Jika Anda tetap ingin menggunakan skrip, cara yang paling mudah adalah dengan memanggil skrip seperti ini:

<path_to_script> && exit

Atau jika skrip berada di Terminal'direktori kerja saat ini seperti ini:

./<script> && exit

Jika Anda sungguh-sungguh tidak ingin/tidak bisa melakukan itu, cara kedua yang paling mudah adalah dengan menambahkan baris ini di akhir skrip Anda:

kill -9 $PPID

Ini akan mengirim sinyal SIGKILL ke proses induk skrip (instance bash yang terhubung ke Terminal). Jika hanya satu instance bash yang terhubung ke Terminal, yang dibunuh akan menyebabkan Terminal menutup dirinya sendiri. Jika beberapa instance bash dihubungkan ke Terminal, yang dibunuh tidak akan menyebabkan Terminal menutup dirinya sendiri.

Komentar (4)

Skrip ini mengakhiri terminal dan dengan demikian shell dan dirinya sendiri.

  • Tanpa ampun membunuh semua proses. Jika Anda memiliki beberapa tab yang terbuka di terminal, maka tab-tab ini juga akan ditutup.*

  • Masalahnya adalah, jika beberapa terminal dibuka dan ini adalah proses anak dari gnome-terminal-server, semua terminal akan dibunuh.*

Dalam kasus ini, skrip harus dimulai di terminal independen, misalnya xterm

 & disown

PPPID=$(awk '{print $4}' "/proc/$PPID/stat")
kill $PPPID
  • PPID

PPID adalah id proses induk, dalam hal ini shell (e.g. /bin/bash)

  • PPPID

PPPID adalah id proses induk dari PPID, dalam hal ini, jendela terminal

  • & disown

Dalam bash shell, perintah builtin disown digunakan untuk menghapus pekerjaan dari tabel pekerjaan, atau untuk menandai pekerjaan sehingga sinyal SIGHUP tidak dikirim ke mereka jika shell induk menerimanya (misalnya jika pengguna log out).

  • awk '{print $4}' "/proc/$PPID/stat"

Mendapatkan nilai kolom keempat dari file /proc/$PPID/stat (misalnya untuk /proc/1/stat mengembalikan 0)

Komentar (17)

Solusi paling sederhana adalah:

xdg-open file.pdf && exit

Tidak seperti perintah serupa lainnya nohup tidak diperlukan untuk membuat perintah mengabaikan SIGHUP, alasannya adalah xdg-open akan keluar dengan memunculkan proses anak yang merupakan aplikasi yang lebih disukai untuk membuka file pdf. Karena proses aktual yang dimulai dari terminal tidak lagi ada untuk dimatikan, nohup tidak diperlukan.

&& mengindikasikan perintah berikutnya akan dijalankan jika perintah sebelumnya berhasil, yaitu mengembalikan kode keluar 0 ($?=0) dan exit hanya akan menutup terminal.

Komentar (11)