Çıkış komutu bir Unix terminalinde nasıl çalışır?


14

Birisi exitkomutun Unix terminalinde nasıl çalıştığını açıklayabilir mi?

Bir arama man exit ve which exityardımcı olmadı ve ben aşağıdaki sorunla karşılaştım.

Yeni Red Hat sistemime Anaconda ve PyCharm için paketler ekledikten sonra exit, bir terminal oturumundan çıkmak için aradığımda bir dizi hata alacağımı fark ettim ve terminal beklendiği gibi sonlandı. Hatalar exit, çağrımın bir çağrıyı tetiklediğini rm ~/anaconda3/.../ve rm ~/PyCharm/....hataya neden olduğunu gösteriyor. Tüm dizinler de bu programlar için indirdiğim paketlerin yerleri gibi görünüyor (örn. Numpy), aşağıya bakın.

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

kararlı

Dosyamda ~/.bash_logoutbir satır vardı

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

Bu satırın yorumlanması hata mesajlarını durdurdu. Tüm geçici dosyaları aramak ve silmek gibi görünüyor. Ancak, içinde "çekirdek" kelimesi olan dizinleri bulmaya ve bunları da silmeye çalışır. Bu sistemde bir ön ayardı.


Sadece netleştirmek için: Eğer Anaconda ve pycharm için paketler üzerinde eklentiyi yükledikten sonra, söyleyerek, sen kullanırken bir dizi hata olsun exitdışarı çıkmak için bu terminal oturumunda - ya bunun olması her zaman kullandığınız exitsonra?
G-Man

1
Bu eklenti paketleri kurulduktan sonra her terminal oturumu için oluştu.
arie64

1
Çok garip, exitbir takma ad olup olmadığını zaten doğruladın mı ?
Dominique

3
coreDosyaları silmeye çalışmasının nedeni, genellikle yer kaplayan ancak kilitlenme yazılımını geliştirmediğiniz sürece nadiren yararlı olan çökme dosyaları ( çekirdek dökümleri ) olmasıdır. Bu durumda core, başarısız olan (ve başarısız numpy.coreolduğu iyi bir şey - adlı bir dizini silmeye çalışıyor , NumPy için önemlidir!).
nneonneo

Günümüzde çoğu sistem varsayılan olarak çekirdek dökümlerini yazmayacak şekilde yapılandırılmıştır (varsayılanı yaparak ulimit -c 0). Bu find -exec rmkomut zaten istediğim bir şey değil, ama -type fona ekleyebilirsiniz . Bunun -exec rm {} +yerine kullanarak birden çok dosyayı silmeyi çok daha verimli hale getirebilirsiniz ... \;, bu nedenle birden çok argümanı tek bir rmkomut satırına (xargs gibi) topluyor
Peter Cordes

Yanıtlar:


20

Genellikle bir kabuktan çıktıktan sonra yürütmeyi yalnızca el ile yapılandırdıysanız görürsünüz. Ama belki de kurduğunuz paketlerden biri bash çıkış kabuğu betiği ile geldi ...

Kontrol;

~ / .Bash_logout

belki oradan bir senaryo çağrısı bulacaksınız, bu garip bir ...


OP çıkış yapmaktan değil, bir kabuktan çıkmaktan bahsediyordu.
karşı

1
@countermode, onlar da o devlet yoktu değildi onların terminal oturumunda çalışan bir giriş kabuğu.
ilkkachu

Ben bir giriş kabuğu ve bu davranış, <code> oturum kapatma </code> çağrısı ile de oluşur. <code> ~ / .bash_logout </code> Benim bir
satırım

<code> find -xdev / (-name * ~ -o -name ./*~ -o -name çekirdek) -exec \ rm '{}' /; </code> ve yorum yaptıktan sonra hata oluşmaz meydana gelir. Bu yüzden doğru yerde yorumları düşünüyorum, bu satır geçici dosyaları silmeye çalışıyor. Teşekkür ederim!
arie64

4
@ arie64 - "<code>" yorumlarda çalışmıyor. SE yorumlarındaki kodu belirtmek için koddan önce ve sonra " ` "(Mezar aksanı / Sol-tek tırnak) kullanın. Gibi: almak için `` -xdev ... '' bul find -xdev ....
Kevin Fegan

25

man bash

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

Bu tür tuzaklar genellikle çıkışta tmp dosyalarını temizlemek için kullanılır, bkz. Https://stackoverflow.com/questions/687014/removing-created-temp-files-in-unexpected-bash-exit

Bunun gibi bir çıkış tuzağı tanımlayın (yeni bir kabukta daha iyi test etmek için):

$ bash
$ trap "rm filetodelete" EXIT

Tanımlanmış EXIT tuzağını göster:

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

Ölçek:

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

Bunun exitdolaylı olarak da "çağrılabileceğini" unutmayın . Yani bunun yerine exittuzağı da tetikleyebilirdiniz kill -HUP $$.


Dikkat çekmeye değer type -a exit-> ilk etapta exit is a shell builtinbash man sayfasını nasıl okuduğunuzu (veya help exitinsan yerine kaçmayı ) nasıl bildiğinizdir .
Peter Cordes

10

exitKomutu bir özel dahili komuta kabuklarda. Kabuk işleminden çıkması gerektiği için yerleşik olmalıdır.

Kabuktan son komutun herhangi biri veya sonuncusu varsa sağlanan çıkış durumu ile çıkar.

Çıktıktan sonra, kabuk EXITvarsa tuzakları çalıştıracaktır . trapŞu anda ayarlanmış olanlar için (Bourne benzeri kabuklarda) çıkışına bakın .

Kabuk (bazı sistemler / kullanıcıların bir giriş kabuğu başlatmak için terminal emülatörlerine yapılandırmak) bir giriş kabuğu olarak çağrıldığında ise birçok kabukları ile, aynı zamanda gibi özel dosyalarda saklı kod çalışır ~/.logout, ~/.zlogout, ~/.bash_logoutve muhtemelen de olanları gelen /etckabuk bağlı .

Bu komutların nereden çalıştırıldığına dair bir fikir edinmek için set -xaramadan önce bunu yapabilirsiniz exit.


Büyük tavsiye ile hata ayıklamak içinset -x
glenn jackman

set -xÇıktının günlüğünü, çıktıktan sonra terminali temizlemeyecek veya kapatamayacak şekilde bash çalıştırarak veya belki yaparak set -xve exec &> exit_log.txtsonra körü körüne yazın exit.
Peter Cordes

3

exit"yerleşik" bir bash komutudur, bu yüzden şaşmamak man exityardımcı olmaz.

Uygun dokümantasyon manuel sayfalardan man bashveya yerleşik helpbash ( help exit) komutuyla edinilebilir .

$ 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.
$

Eğer varsa gerçekten bilmek istiyorum nasıl : çalıştığını, kaynağında bir göz http://git.savannah.gnu.org/cgit/bash.git/tree/builtins/exit.def?h=bash-4.4

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.