Jak działa polecenie exit na terminalu uniksowym?

14

Czy ktoś mógłby wyjaśnić, jak to exitpolecenie działa w terminalu uniksowym?

Wyszukiwanie man exit i which exitnie było pomocne, natrafiłem na następujący problem.

Po zainstalowaniu pakietów dodatkowych dla Anacondy i PyCharm w moim nowym systemie Red Hat zauważyłem, że kiedy dzwonię exitdo wyjścia z sesji terminalu, dostaję serię błędów, a następnie terminal kończy się zgodnie z oczekiwaniami. Błędy wydają się sugerować, że moje wywołanie exitwywołuje połączenie rm ~/anaconda3/.../i rm ~/PyCharm/....powoduje błąd. Wszystkie katalogi również wydają się być lokalizacjami pakietów, które pobrałem dla tych programów (tj. Numpy), patrz poniżej.

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

Zdecydowany

W moim ~/.bash_logoutpliku była linia

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

Komentowanie tej linii zatrzymało komunikaty o błędach. Wygląda na to, że wyszukuje i usuwa wszystkie pliki tymczasowe. Ale próbuje także znaleźć katalogi ze słowem „core”, a także je usunąć. To było ustawienie wstępne w systemie.

arie64
źródło
Żeby wyjaśnić: czy mówisz, że po zainstalowaniu pakietów add dla Anacondy i PyCharm, pojawia się seria błędów, gdy exitwychodzisz z tej sesji terminalowej - czy dzieje się tak za każdym razem , gdy używasz exitpóźniej?
G-Man mówi „Przywróć Monikę”
1
Występowało to dla każdej sesji terminala po zainstalowaniu tych pakietów dodatków.
arie64
1
Bardzo dziwne, czy sprawdziłeś już, czy exitjest to alias?
Dominique,
3
Powodem, dla którego próbuje usunąć corepliki, jest to, że zwykle są to pliki zrzutu awaryjnego ( zrzuty pamięci ), które zajmują miejsce, ale rzadko są przydatne, chyba że tworzysz oprogramowanie powodujące awarię . W tym przypadku próbuje usunąć katalog o nazwie core, który się nie powiedzie (i dobrze, że się nie powiedzie - numpy.corejest niezbędny dla NumPy!).
nneonneo
Większość systemów w dzisiejszych czasach jest skonfigurowana tak, aby domyślnie nie zapisywać zrzutów pamięci (przez ulimit -c 0ustawienie domyślne). To find -exec rmpolecenie i tak nie jest tym, czego chciałbym, ale możesz je dodać -type f. Możesz także znacznie usprawnić usuwanie wielu plików, używając -exec rm {} +zamiast tego ... \;, więc dodaje wiele argumentów do jednego rmwiersza poleceń (np. Xargs)
Peter Cordes

Odpowiedzi:

20

Zazwyczaj wykonanie zobaczysz tylko po wyjściu z powłoki, jeśli ręcznie ją skonfigurowałeś. Ale może jeden z zainstalowanych pakietów zawiera skrypt powłoki bash wyjścia ...

czek;

~ / .bash_logout

może stamtąd znajdziesz wywołanie skryptu, to dziwne ...

mikejonesey
źródło
OP nie mówił o wylogowaniu, ale o wyjściu z powłoki.
kontr-
1
@countermode, nie stwierdzili również, że nie była to powłoka logowania działająca w ich sesji terminalowej.
ilkkachu
Jestem w powłoce logowania i takie zachowanie występuje również w przypadku wywołania <code> wylogowania </code>. W moim <code> ~ / .bash_logout </code> mam linię
arie64 25.10.16
<code> find -xdev / (-name * ~ -o -name ./*~ -o -name core) -exec \ rm '{}' /; </code>, który po skomentowaniu błąd nie pojawić się. Myślę więc, że komentarze były poprawne, ta linia próbuje usunąć pliki tymczasowe. Dziękuję Ci!
arie64
4
@ arie64 - „<kod>” nie działa w komentarzach. Aby wskazać kod w komentarzach na SE, należy użyć „ ` ”(Grave-Akcent / lewo-apostrofu) przed i po kodzie. Jak: `find -xdev ...` aby uzyskać find -xdev ....
Kevin Fegan
25

man bash

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

Takie pułapki są często używane do czyszczenia plików tmp przy wychodzeniu, patrz /programming/687014/removing-created-temp-files-in-u nieoczekiwany-bash-exit

Zdefiniuj pułapkę wyjścia w ten sposób (dla lepszego testowania w nowej powłoce):

$ bash
$ trap "rm filetodelete" EXIT

Pokaż zdefiniowaną pułapkę EXIT:

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

Test:

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

Zauważ, że exitmożna to także „wywołać” również w sposób dorozumiany. Zamiast tego exitmógłbyś uruchomić pułapkę kill -HUP $$.

rudimeier
źródło
Warto zwrócić uwagę type -a exit-> exit is a shell builtinto, w jaki sposób możesz przeczytać stronę podręcznika bash (lub uruchomić help exitzamiast man).
Peter Cordes
10

exitKomenda jest specjalnym wbudowanym w komendzie w muszli. Musi być wbudowany, ponieważ musi wyjść z procesu powłoki.

Wychodzi z powłoki z podanym statusem wyjścia, jeśli którykolwiek lub inny z ostatniego polecenia w innym przypadku.

Po wyjściu powłoka uruchomi EXITpułapki, jeśli takie istnieją. Zobacz dane wyjściowe trap(w powłokach typu Bourne'a) dla aktualnie ustawionych.

Z wielu muszli, jeśli powłoka została wywołana jako powłoki logowania (niektóre systemy / użytkowników skonfigurować emulatory terminali, aby uruchomić powłokę logowania), to będzie również uruchomić kod przechowywane w specjalnych plikach podoba ~/.logout, ~/.zlogout, ~/.bash_logouti ewentualnie odpowiedniej, w /etczależności od powłoki .

Możesz zrobić set -xprzed wywołaniem, exitaby dowiedzieć się, skąd te polecenia są uruchamiane.

Stéphane Chazelas
źródło
Świetna rada do debugowania zset -x
glenn jackman
Możesz uzyskać dziennik danych set -xwyjściowych, uruchamiając bash w sposób, który nie wyczyści ani nie zamknie terminalu po wyjściu, lub może robiąc to set -x, exec &> exit_log.txta następnie ślepo wpisz exit.
Peter Cordes
3

exitjest wbudowanym poleceniem bash, więc nic dziwnego, że man exitnie pomaga.

Prawidłową dokumentację można uzyskać na stronach podręcznika man bashlub za pomocą wbudowanego polecenia helpbash ( 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.
$

Jeśli naprawdę chcesz wiedzieć, jak to działa, zajrzyj do źródła: http://git.savannah.gnu.org/cgit/bash.git/tree/builtins/exit.def?h=bash-4.4

Michel Billaud
źródło