Bagaimana cara kerja perintah keluar pada terminal Unix?

14

Bisakah seseorang tolong jelaskan bagaimana exitperintah itu bekerja di terminal Unix?

Pencarian man exit dan which exittidak membantu dan saya telah menemukan masalah berikut.

Setelah menginstal paket add-on untuk Anaconda dan PyCharm pada sistem Red Hat baru saya, saya perhatikan bahwa ketika saya menelepon exituntuk keluar dari sesi terminal saya akan mendapatkan serangkaian kesalahan, dan kemudian terminal berhenti seperti yang diharapkan. Kesalahan tampaknya menunjukkan bahwa panggilan saya exitmemicu panggilan rm ~/anaconda3/.../danrm ~/PyCharm/.... , menyebabkan kesalahan. Semua direktori juga tampak sebagai lokasi paket yang saya unduh untuk program-program ini (yaitu numpy), lihat di bawah.

$ exit
rm: cannot remove ‘~/anaconda3/lib/python3.5/site-packages/numpy/core’: Is a directory
...
...

Terselesaikan

Dalam ~/.bash_logoutfile saya , ada satu baris

find ~ -xdev ( -name *~ -o -name .*~ -o -name core ) -exec \rm '{}' \;

Mengomentari baris ini menghentikan pesan kesalahan. Tampaknya untuk mencari dan menghapus semua file sementara. Tetapi ia juga berusaha menemukan direktori dengan kata "inti" di dalamnya, dan menghapusnya juga. Ini adalah preset dalam sistem.

arie64
sumber
Hanya untuk memperjelas: Anda mengatakan bahwa, setelah Anda menginstal add untuk paket untuk Anaconda dan PyCharm, Anda mendapatkan serangkaian kesalahan ketika Anda menggunakan exituntuk keluar dari itu sesi terminal - atau yang yang terjadi setiap kali Anda menggunakan exitsetelah itu?
G-Man Mengatakan 'Reinstate Monica'
1
Ini telah terjadi untuk setiap sesi terminal setelah menginstal paket tambahan ini.
arie64
1
Sangat aneh, apakah Anda sudah memverifikasi apakah exititu alias?
Dominique
3
Alasan mengapa ia mencoba untuk menghapus corefile adalah karena mereka biasanya file crashdump ( core dumps ) yang mengambil ruang tetapi jarang bermanfaat kecuali jika Anda mengembangkan perangkat lunak yang mogok. Dalam hal ini berusaha menghapus direktori bernama core, yang gagal (dan untungnya gagal - numpy.coresangat penting untuk NumPy!).
nneonneo
Sebagian besar sistem saat ini dikonfigurasikan untuk tidak menulis dump inti secara default (dengan membuat ulimit -c 0default). Itu find -exec rmperintah bukanlah sesuatu yang saya ingin pula, tapi Anda bisa menambahkan -type funtuk itu. Anda juga dapat membuatnya jauh lebih efisien menghapus banyak file dengan menggunakan -exec rm {} +alih-alih ... \;, sehingga batch banyak args ke satu rmbaris perintah (seperti xargs)
Peter Cordes

Jawaban:

20

Yah biasanya Anda hanya akan melihat eksekusi setelah keluar dari shell jika Anda mengkonfigurasi ini secara manual. Tapi mungkin salah satu paket yang Anda instal datang dengan skrip shell bash exit ...

memeriksa;

~ / .bash_logout

mungkin Anda akan menemukan panggilan skrip dari sana, ini yang aneh ...

mikejonesey
sumber
OP tidak berbicara tentang keluar tetapi tentang keluar dari shell.
countermode
1
@ countermode, mereka juga tidak menyatakan bahwa itu bukan shell login yang berjalan di sesi terminal mereka.
ilkkachu
Saya berada di shell login dan perilaku ini juga terjadi dengan panggilan ke <code> logout </code>. Dalam <code> ~ / .bash_logout </code> saya, saya punya garis
arie64
<code> find -xdev / (-name * ~ -o -name ./*~ -o -name inti) -exec \ rm '{}' /; </code> yang, setelah berkomentar, kesalahannya tidak terjadi. Jadi saya pikir komentar mana yang benar, baris ini sedang mencoba untuk menghapus file sementara. Terima kasih!
arie64
4
@ arie64 - "<code>" tidak berfungsi di komentar. Untuk menunjukkan kode dalam komentar di SE, gunakan " ` "(Kutipan aksen / Kiri-tunggal-kutipan) sebelum dan sesudah kode. Seperti: `find -xdev ...` untuk mendapatkan find -xdev ....
Kevin Fegan
25

man bash

  exit [n]
         [...]  A trap on EXIT is executed before the shell terminates.

Perangkap seperti itu sering digunakan untuk membersihkan file tmp saat keluar, lihat /programming/687014/removing-created-temp-files-in-unexpected-bash-exit

Tentukan jebakan keluar seperti ini (untuk pengujian yang lebih baik dalam shell baru):

$ bash
$ trap "rm filetodelete" EXIT

Tampilkan perangkap EXIT yang ditentukan:

$ trap -p EXIT
trap -- 'rm filetodelete' EXIT

Uji:

$ exit
rm: cannot remove filetodelete’: No such file or directory

Catatan yang exitmungkin "dipanggil" juga secara implisit. Jadi, alih-alih exitAnda bisa juga memicu jebakan kill -HUP $$.

rudimeier
sumber
Layak menunjukkan type -a exit-> exit is a shell builtinadalah bagaimana Anda tahu untuk membaca halaman bash man (atau menjalankan help exitbukan manusia) di tempat pertama.
Peter Cordes
10

The exitperintah khusus built-in perintah dalam kerang. Itu harus built-in karena perlu keluar dari proses shell.

Itu keluar shell dengan status keluar yang disediakan jika ada atau yang dari perintah terakhir sebaliknya.

Setelah keluar, shell akan menjalankan EXITperangkap jika ada. Lihat output trap(dalam cangkang mirip Bourne) untuk yang saat ini ditetapkan.

Dengan banyak kerang, jika shell itu dipanggil sebagai shell login (beberapa sistem / pengguna mengkonfigurasi emulator terminal untuk memulai shell login), juga akan menjalankan kode yang disimpan dalam file khusus seperti ~/.logout, ~/.zlogout, ~/.bash_logoutdan mungkin sesuai yang di/etc tergantung pada shell .

Anda bisa melakukan set -xsebelum memanggil exituntuk mengetahui dari mana perintah-perintah itu dijalankan.

Stéphane Chazelas
sumber
Saran bagus untuk debug denganset -x
glenn jackman
Anda bisa mendapatkan log dari set -xoutput dengan menjalankan bash dengan cara yang tidak akan menghapus atau menutup terminal setelah itu keluar, atau mungkin dengan melakukan set -x, exec &> exit_log.txtkemudian ketik secara membabi buta exit.
Peter Cordes
3

exitadalah perintah "builtin" dari bash, jadi tidak heran man exittidak membantu.

Dokumentasi yang tepat dapat diperoleh dari halaman manual man bash, atau dengan perintah builtin helpdari bash ( help exit).

$ help exit
exit: exit [n]
    Exit the shell.

    Exits the shell with a status of N.  If N is omitted, the exit status
    is that of the last command executed.
$

Jika Anda benar - benar ingin tahu cara kerjanya, lihat sumbernya: http://git.savannah.gnu.org/cgit/bash.git/tree/builtins/exit.def?h=bash-4.4

Michel Billaud
sumber