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.
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.
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
<your_command> & disown
PPPID=$(awk '{print $4}' "/proc/$PPID/stat")
kill $PPPID
PPID adalah id proses induk, dalam hal ini shell (e.g. /bin/bash
)
PPPID adalah id proses induk dari PPID, dalam hal ini, jendela terminal
<your_command> & 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)
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.