Saya mencoba menulis bash
skrip untuk membuka file tertentu (kebanyakan file pdf) menggunakan gnome-open
perintah. Saya juga ingin terminal keluar setelah membuka file pdf.
Saya telah mencoba menambahkan exit
ke akhir skrip saya tetapi itu tidak menutup terminal. Saya memang mencoba mencari jawaban untuk pertanyaan saya secara online tetapi saya tidak dapat menemukan jawaban yang tepat, saya akan sangat menghargainya jika kalian dapat membantu.
Saya membutuhkan jawaban yang hanya membunuh terminal dari mana saya menjalankan perintah tidak semua terminal akan mungkin? Jawaban sebelumnya yang saya terima membunuh semua jendela terminal yang terbuka. Saya tidak menyadari ini adalah masalahnya sampai hari ini.
command-line
bash
scripts
Rumesh
sumber
sumber
gnome-open
denganxdg-open
dalam skrip saya tetapi tidak ada perubahan. Terminal masih tetap terbukaJawaban:
Jika Anda hanya membuka satu file, Anda tidak benar - benar perlu menggunakan skrip, karena skrip dimaksudkan untuk menjadi cara yang mudah untuk menjalankan banyak perintah dalam satu baris, sementara di sini Anda hanya perlu menjalankan dua perintah (termasuk
exit
) .Jika Anda ingin menjalankan
exit
setelah perintah atau setelah rantai perintah, Anda dapat rantai ke apa yang sudah Anda miliki dengan menggunakan&&
operator (yang pada keberhasilan perintah / rantai perintah sebelumnya akan menjalankan perintah berikutnya) atau dengan menggunakan;
operator (yang sukses dan gagal pada perintah / rantai perintah sebelumnya akan menjalankan perintah berikutnya).Dalam hal ini akan menjadi seperti itu:
* <path_to_pfd_file> = path file pdf
exit
diletakkan di akhir skrip tidak berfungsi karena ia hanya keluar daribash
contoh di mana skrip dijalankan, yang merupakanbash
contoh lain dari instance dalam Terminalbash
.Jika Anda tetap ingin menggunakan skrip, cara paling mudah adalah dengan memanggil skrip seperti:
Atau jika skrip ada di direktori kerja Terminal saat ini seperti:
Jika Anda benar - benar tidak ingin / tidak bisa melakukan itu, cara paling mudah kedua adalah menambahkan baris ini di akhir skrip Anda:
Ini akan mengirimkan
SIGKILL
sinyal ke ke proses induk skrip (bash
instance terhubung ke Terminal). Jika hanya satubash
instance yang terhubung ke Terminal, yang terbunuh akan menyebabkan Terminal menutup sendiri. Jika beberapabash
instance ditautkan ke Terminal, yang terbunuh tidak akan menyebabkan Terminal menutup sendiri.sumber
SIGTERM
ini tidak cukup.Script ini mengakhiri terminal dan dengan demikian shell dan dirinya sendiri.
Tanpa ampun membunuh semua proses. Jika Anda memiliki banyak tab terbuka di terminal, maka ini juga ditutup.
Masalahnya adalah, jika beberapa terminal dibuka dan ini adalah proses anak
gnome-terminal-server
, semua terminal akan terbunuh.Dalam hal ini, skrip harus dimulai di terminal independen, misalnya
xterm
PPID
PPID adalah id proses induk, dalam hal ini shell (
e.g. /bin/bash
)PPPID
PPPID adalah id proses induk PPID, dalam hal ini, jendela terminal
<your_command> & disown
Di bash shell, perintah builtin disown digunakan untuk menghapus pekerjaan dari tabel pekerjaan, atau untuk menandai pekerjaan sehingga sinyal SIGHUP tidak dikirim kepada mereka jika shell induk menerimanya (misalnya jika pengguna logout).
awk '{print $4}' "/proc/$PPID/stat"
Mendapat nilai kolom keempat file
/proc/$PPID/stat
(mis. Untuk/proc/1/stat
itu mengembalikan 0)sumber
ps xa | grep $$
=>4381 pts/0 Ss 0:01 /usr/bin/zsh
Anda bisa menggunakannya .
exec ./your-script
Emulator terminal seperti Terminal GNOME berhenti ketika proses awal berjalan di dalamnya - yang biasanya berupa shell - berhenti.
Jika Anda sudah berada di terminal dan satu-satunya hal yang ingin Anda lakukan sebelum berhenti dari terminal itu adalah menjalankan skrip (atau program) tertentu, maka ini berarti Anda tidak lagi benar-benar membutuhkan shell yang berjalan di dalamnya lagi. Dengan demikian Anda dapat menggunakan
exec
builtin shell untuk membuat shell menggantinya dengan proses yang dibuat oleh perintah Anda.exec
.Sintaksnya adalah , mis . , .
exec command
exec ./your-script
exec
: sebuah contohSebagai contoh, misalkan saya memiliki skrip shell bernama
count
, ditandai executable, dan terletak di direktori saat ini. Itu mengandung:Dan, di terminal, saya menjalankan:
Ini mencetak angka
5
,4
,3
,2
, dan1
, satu per detik, dan kemudian menutup jendela terminal.Jika Anda menjalankan ini dari sesuatu selain proses pertama berjalan di terminal Anda - misalnya, jika Anda berlari
bash
pertama untuk memulai contoh shell lain - maka ini membawa Anda kembali ke shell yang dibuat bahwa proses, bukan berhenti terminal. (Peringatan ini berlaku sama untukexit
metode berbasis.)Anda bisa menggunakannya .
./your-script; exit
Jika Anda tidak ingin memberi tahu shell Anda untuk menggantinya dengan proses baru (via
exec
), Anda dapat menyuruh shell untuk tetap bertahan tetapi keluar sendiri segera setelah proses baru selesai.Untuk melakukan ini, jalankan perintah dan
exit
perintah Anda, pisahkan dengan;
sehingga mereka dapat diberikan pada satu baris.Sintaksnya adalah
command; exit
, mis . , ../your-script; exit
command; exit
vs.command && exit
Anda mungkin memperhatikan ini mirip dengan metode yang disarankan dalam jawaban kos dan heemayl . Perbedaannya adalah:
./your-script && exit
&&
menjalankan perintah kedua hanya jika perintah pertama melaporkan bahwa ia berhasil dengan mengembalikan kode keluar nol.;
menjalankan perintah kedua terlepas dari apakah perintah pertama dilaporkan berhasil atau tidak.Yang mana yang Anda inginkan tergantung pada situasi spesifik. Jika perintah gagal, apakah Anda ingin shell panggilan (dan terminal hosting) tetap terjaga? Jika demikian, gunakan
&&
; jika tidak, gunakan;
.Ada juga
command || exit
, yang keluar dari shell panggilan hanya jikacommand
dilaporkan gagal .sumber
Anda dapat sumber skrip Anda alih-alih menjalankannya misalnya
sumber
Secara pribadi saya akan menjalankan perintah untuk membuka file pdf atau lainnya dalam subshell, menunda untuk membiarkan file terbuka, dan kemudian keluar. Pada dasarnya, inilah yang saya uji
(nohup gnome-open *.pdf &); sleep 2; exit
Variasi akan ini
nohup gnome-open *.pdf && sleep 2 && exit
sumber
nohup
mengabaikan sinyal hangup,nohup xdg-open some_program
bekerja untuk saya, danexit
tidak dibutuhkan.nohup
mengalihkan pesan kenohup.out
file:nohup: ignoring input and appending output to nohup.out
Solusi paling sederhana adalah:
Tidak seperti perintah serupa lainnya
nohup
tidak diperlukan untuk membuat perintah mengabaikanSIGHUP
, alasannyaxdg-open
akan keluar menelurkan proses anak yang merupakan aplikasi pilihan untuk membuka file pdf. Karena proses sebenarnya dimulai dari terminal tidak ada lagi di sana untuk dibunuh,nohup
tidak diperlukan.&&
menunjukkan perintah berikutnya akan dijalankan jika perintah sebelumnya berhasil yaitu mengembalikan kode keluar0
($?=0
) danexit
hanya akan menutup terminal.sumber
exit
di akhir dan tidak bekerja ..exit
di dalam skrip, yang tidak berguna karena memiliki efek keluar daribash
contoh di mana skrip dieksekusi daripadabash
contoh induk (yang ditautkan ke Terminal), yang akan menyebabkan Terminal untuk menutup sebagai gantinyaxdg-open
sudah berjalan di latar belakang dan tidak terhubung dari Terminal, jadi Anda tidak perlu dinohup
sini, ditambah dari apa yang saya pahami OP berjalanxdg-open
beberapa kali di dalam skrip untuk membuka banyak file sekaligus, menggunakanxdg-open
seperti itu di dalam skrip akan menyebabkan skrip untuk keluar padaxdg-open
kejadian pertamaxdg-open
di backgr, bahkan jika saya punyanohup
adalah untuk alasan yang berbeda & harus ada di sana .. setiap proses latar belakang dari terminal asal akan terbunuh ketika Anda akan membunuh terminal induk ..nohup
ada untuk mencegah it..saya tidak perlu menggunakan terminal lagi secara interaktif, tidak perlu memasukkan proses dalam bg..pada poin ke-2 Anda yang juga dapat dicegah dengan menjalankan masing-masingxdg-open && exit
dalam sebuah subkulit ..Untuk secara eksplisit menjawab pertanyaan judul,
"Keluar dari terminal setelah menjalankan skrip bash" :
Jalankan hanya skrip Anda di terminal
Tanpa melihat detail apa yang dilakukan skrip, skrip dapat langsung dijalankan di dalam terminal dengan opsi
-e
(--command
), tanpa memulai shell - itu digunakan sebagai ganti shell lalu:Gunakan opsi
-x
(--execute
) saat Anda ingin memberikan argumen ke skrip. Dengan ini, hanya seluruh sisa dari commandline diambil sebagai perintah dan argumen.Jika skrip Anda keluar, tidak ada shell interaktif yang dapat menahan apa pun dengan menunggu input pengguna.
Contohnya
Teminal hanya akan keluar setelah perintah yang berjalan di dalamnya keluar - seperti ini, menutup setelah
sleep
berjalan 4 detik, tanpa shell:Tentu saja, Anda masih dapat menggunakan skrip shell, karena skrip Anda menggunakan contoh shell yang berbeda pula.
Anda juga dapat menjalankan shell dengan skrip eksplisit - itu tidak akan interaktif:
sumber