Könnte jemand erklären, wie der exit
Befehl im Unix-Terminal funktioniert?
Eine Suche nach man exit
und which exit
war nicht hilfreich und ich bin auf das folgende Problem gestoßen.
Nach der Installation von Add-On-Paketen für Anaconda und PyCharm auf meinem neuen Red Hat-System stellte ich fest, dass beim exit
Verlassen einer Terminalsitzung immer eine Reihe von Fehlern auftrat und das Terminal wie erwartet beendet wurde. Die Fehler scheinen darauf hinzudeuten, dass mein Anruf bei exit
einen Anruf 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 (dh numpy), siehe unten.
$ exit
rm: cannot remove ‘~/anaconda3/lib/python3.5/site-packages/numpy/core’: Is a directory
...
...
Behoben
In meiner ~/.bash_logout
Akte gab es eine Zeile
find ~ -xdev ( -name *~ -o -name .*~ -o -name core ) -exec \rm '{}' \;
Das Kommentieren dieser Zeile hat die Fehlermeldungen gestoppt. Es scheint, alle temporären Dateien zu suchen und zu löschen. Es wird jedoch auch versucht, Verzeichnisse mit dem Wort "core" zu finden und diese ebenfalls zu löschen. Dies war eine Voreinstellung im System.
quelle
exit
von auszutreten dieser Terminalsitzung - oder dass das passiert jedes Mal , die Sie verwendenexit
danach?exit
es sich um einen Alias handelt?core
Dateien zu löschen , ist, dass es sich normalerweise um Crash-Dump-Dateien ( Core-Dumps ) handelt, die Speicherplatz belegen, aber nur dann nützlich sind, wenn Sie die Crash-Software entwickeln. In diesem Fall wird versucht, ein Verzeichnis mit dem Namen zu löschencore
, was fehlschlägt (und gut, dass dies fehlschlägt -numpy.core
ist für NumPy von entscheidender Bedeutung!).ulimit -c 0
standardmäßig keine Core-Dumps geschrieben werden ( Standardeinstellung). Diesenfind -exec rm
Befehl möchte ich sowieso nicht, aber Sie könnten ihn ergänzen-type f
. Sie können das Löschen mehrerer Dateien auch effizienter gestalten, indem Sie-exec rm {} +
anstelle von... \;
mehrere Argumente in einerrm
Befehlszeile stapeln (z. B. xargs)Antworten:
Normalerweise wird die Ausführung erst beim Beenden einer Shell angezeigt, wenn Sie dies manuell konfiguriert haben. Aber vielleicht hat eines der Pakete, die Sie installiert haben, ein Bash-Exit-Shell-Skript ...
prüfen;
Vielleicht finden Sie dort einen Skriptaufruf, der seltsam ist ...
quelle
find -xdev ...
.man bash
Solche Traps werden häufig verwendet, um tmpfiles beim Beenden zu bereinigen (siehe /programming/687014/removing-created-temp-fileses-in-unexpected-bash-exit)
Definieren Sie eine Exit-Trap wie folgt (zum besseren Testen in einer neuen Shell):
Zeige definierte EXIT-Falle:
Prüfung:
Beachten Sie, dass
exit
dies implizit auch "aufgerufen" werden kann. Also stattexit
du hättest auch die Falle durch auslösen könnenkill -HUP $$
.quelle
type -a exit
->exit is a shell builtin
ist, wie Sie die Bash-Manpage lesen (oderhelp exit
anstelle von man ausführen ).Der
exit
Befehl ist ein spezieller Einbau in Befehl in Schalen. Es muss eingebaut sein, um den Shell-Prozess zu beenden.Es verlässt die Shell mit dem Exit-Status, falls vorhanden, oder dem des letzten anderen Befehls.
Beim Beenden werden die
EXIT
Fallen von der Shell ausgeführt , sofern vorhanden. Siehe die Ausgabe vontrap
(in Bourne-ähnlichen Shells) für die aktuell eingestellten.Mit vielen Muscheln, wenn die Shell als Login - Shell aufgerufen wurde (einige Systeme / Benutzer konfigurieren Terminalemulatoren eine Login - Shell starten), wird es auch den Code in speziellen Dateien gespeichert ausführen möchten
~/.logout
,~/.zlogout
,~/.bash_logout
und möglicherweise diejenigen entsprechen , die in/etc
an der Schale abhängig .Sie können
set -x
vor dem Aufrufexit
eine Aktion ausführen, um eine Vorstellung davon zu erhalten, von wo aus diese Befehle ausgeführt werden.quelle
set -x
set -x
Ausgabe abrufen, indem Sie entweder bash so ausführen, dass das Terminal nach dem Beenden nicht gelöscht oder geschlossen wird, oder indem Sie dies tunset -x
undexec &> exit_log.txt
dann blind eingebenexit
.exit
ist ein "eingebautes" Kommando von bash, also kein Wunder, dass es nichtman exit
hilft.Die richtige Dokumentation erhalten Sie auf den Handbuchseiten
man bash
oder mit dem eingebauten Befehlhelp
bash (help exit
).Wenn Sie wirklich wissen möchten, wie es funktioniert, schauen Sie sich die Quelle an: http://git.savannah.gnu.org/cgit/bash.git/tree/builtins/exit.def?h=bash-4.4
quelle