Czy ktoś mógłby wyjaśnić, jak to exit
polecenie działa w terminalu uniksowym?
Wyszukiwanie man exit
i which exit
nie 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ę exit
do 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 exit
wywoł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_logout
pliku 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.
źródło
exit
wychodzisz z tej sesji terminalowej - czy dzieje się tak za każdym razem , gdy używaszexit
później?exit
jest to alias?core
pliki, 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 nazwiecore
, który się nie powiedzie (i dobrze, że się nie powiedzie -numpy.core
jest niezbędny dla NumPy!).ulimit -c 0
ustawienie domyślne). Tofind -exec rm
polecenie 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 jednegorm
wiersza poleceń (np. Xargs)Odpowiedzi:
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;
może stamtąd znajdziesz wywołanie skryptu, to dziwne ...
źródło
find -xdev ...
.man bash
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):
Pokaż zdefiniowaną pułapkę EXIT:
Test:
Zauważ, że
exit
można to także „wywołać” również w sposób dorozumiany. Zamiast tegoexit
mógłbyś uruchomić pułapkękill -HUP $$
.źródło
type -a exit
->exit is a shell builtin
to, w jaki sposób możesz przeczytać stronę podręcznika bash (lub uruchomićhelp exit
zamiast man).exit
Komenda 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
EXIT
pułapki, jeśli takie istnieją. Zobacz dane wyjściowetrap
(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_logout
i ewentualnie odpowiedniej, w/etc
zależności od powłoki .Możesz zrobić
set -x
przed wywołaniem,exit
aby dowiedzieć się, skąd te polecenia są uruchamiane.źródło
set -x
set -x
wyjściowych, uruchamiając bash w sposób, który nie wyczyści ani nie zamknie terminalu po wyjściu, lub może robiąc toset -x
,exec &> exit_log.txt
a następnie ślepo wpiszexit
.exit
jest wbudowanym poleceniem bash, więc nic dziwnego, żeman exit
nie pomaga.Prawidłową dokumentację można uzyskać na stronach podręcznika
man bash
lub za pomocą wbudowanego poleceniahelp
bash (help exit
).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
źródło