
Könnte jemand bitte erklären, wie der exit
Befehl im Unix-Terminal funktioniert?
Eine Suche unter man exit
und which exit
war nicht hilfreich und ich bin auf das folgende Problem gestoßen.
Nachdem ich Zusatzpakete für Anaconda und PyCharm auf meinem neuen Red Hat-System installiert hatte, bemerkte ich, dass jedes Mal, wenn ich exit
zum Beenden einer Terminalsitzung aufrief, eine Reihe von Fehlern auftrat und das Terminal dann wie erwartet beendet wurde. Die Fehler scheinen darauf hinzudeuten, dass mein Aufruf von exit
einen Aufruf auslöst rm ~/anaconda3/.../
und rm ~/PyCharm/....
einen Fehler verursacht. Alle Verzeichnisse scheinen auch die Speicherorte der Pakete zu sein, die ich für diese Programme heruntergeladen habe (z. B. Numpy), siehe unten.
$ exit
rm: cannot remove ‘~/anaconda3/lib/python3.5/site-packages/numpy/core’: Is a directory
...
...
Gelöst
In meiner ~/.bash_logout
Datei gab es eine Zeile
find ~ -xdev ( -name *~ -o -name .*~ -o -name core ) -exec \rm '{}' \;
Das Auskommentieren dieser Zeile stoppte die Fehlermeldungen. Es scheint, als ob alle temporären Dateien gesucht und gelöscht werden. Es versucht aber auch, Verzeichnisse zu finden, die das Wort „core“ enthalten, und diese ebenfalls zu löschen. Dies war eine Voreinstellung im System.
Antwort1
man bash
exit [n] [...] A trap on EXIT is executed before the shell terminates.
Solche Traps werden oft verwendet, um temporäre Dateien beim Beenden zu bereinigen, siehe https://stackoverflow.com/questions/687014/removing-created-temp-files-in-unexpected-bash-exit
Definieren Sie eine Exit-Trap wie diese (für bessere Tests in einer neuen Shell):
$ bash
$ trap "rm filetodelete" EXIT
Definierte EXIT-Trap anzeigen:
$ trap -p EXIT
trap -- 'rm filetodelete' EXIT
Prüfen:
$ exit
rm: cannot remove ‘filetodelete’: No such file or directory
Beachten Sie, dass exit
auch implizit „aufgerufen“ werden kann. Statt exit
hätten Sie die Falle also auch durch auslösen können kill -HUP $$
.
Antwort2
Normalerweise sehen Sie die Ausführung nur beim Beenden einer Shell, wenn Sie dies manuell konfiguriert haben. Aber vielleicht war eines der von Ihnen installierten Pakete mit einem Bash-Exit-Shell-Skript ausgestattet ...
überprüfen;
~/.bash_logout
vielleicht finden Sie dort einen Skriptaufruf, es ist ein seltsamer ...
Antwort3
Der exit
Befehl ist ein speziellereingebautBefehl in Shells. Er muss integriert sein, da er den Shell-Prozess beenden muss.
Es beendet die Shell mit dem angegebenen Beendigungsstatus (sofern vorhanden) oder andernfalls mit dem des letzten Befehls.
Beim Beenden führt die Shell die EXIT
Traps aus, falls vorhanden. Die aktuell gesetzten Traps finden Sie in der Ausgabe trap
(in Bourne-ähnlichen Shells).
Bei vielen Shells gilt: Wenn die Shell als Anmelde-Shell aufgerufen wurde (einige Systeme/Benutzer konfigurieren Terminalemulatoren zum Starten einer Anmelde-Shell), wird je nach Shell auch der in speziellen Dateien wie ~/.logout
, und möglicherweise entsprechenden Dateien in gespeicherte Code ausgeführt.~/.zlogout
~/.bash_logout
/etc
Sie können set -x
vor dem Aufruf einen Befehl ausführen exit
, um eine Vorstellung davon zu bekommen, von wo aus diese Befehle ausgeführt werden.
Antwort4
exit
ist ein „integrierter“ Befehl der Bash, also kein Wunder, dass man exit
es nicht hilft.
Eine entsprechende Dokumentation erhalten Sie aus den Manualpages man bash
oder mit dem integrierten Befehl help
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.
$
Wenn duWirklichwill wissenWiees funktioniert, schauen Sie sich die Quelle an:http://git.savannah.gnu.org/cgit/bash.git/tree/builtins/exit.def?h=bash-4.4