Wie funktioniert der Befehl exit auf einem Unix-Terminal?

14

Könnte jemand erklären, wie der exitBefehl im Unix-Terminal funktioniert?

Eine Suche nach man exit und which exitwar 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 exitVerlassen einer Terminalsitzung immer eine Reihe von Fehlern auftrat und das Terminal wie erwartet beendet wurde. Die Fehler scheinen darauf hinzudeuten, dass mein Anruf bei exiteinen 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_logoutAkte 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.

arie64
quelle
Nur um zu klären: Sagen Sie , dass, nachdem Sie Add - On - Pakete für Anaconda und PyCharm installieren, erhalten Sie eine Reihe von Fehlern bei der Verwendung exitvon auszutreten dieser Terminalsitzung - oder dass das passiert jedes Mal , die Sie verwenden exitdanach?
G-Man sagt, dass Monica
1
Es ist für jede Terminalsitzung nach der Installation dieser Add-On-Pakete aufgetreten.
Arie64
1
Sehr seltsam, haben Sie bereits überprüft, ob exites sich um einen Alias ​​handelt?
Dominique
3
Der Grund, warum versucht wird, coreDateien 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öschen core, was fehlschlägt (und gut, dass dies fehlschlägt - numpy.coreist für NumPy von entscheidender Bedeutung!).
Nneonneo
Die meisten Systeme sind heutzutage so konfiguriert, dass ulimit -c 0standardmäßig keine Core-Dumps geschrieben werden ( Standardeinstellung). Diesen find -exec rmBefehl 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 einer rmBefehlszeile stapeln (z. B. xargs)
Peter Cordes

Antworten:

20

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;

~ / .bash_logout

Vielleicht finden Sie dort einen Skriptaufruf, der seltsam ist ...

mikejonesey
quelle
Das OP sprach nicht vom Abmelden, sondern vom Verlassen einer Shell.
Gegenmodus
1
@countermode, sie gaben auch nicht an, dass es sich nicht um eine Anmeldeshell handelte, die in ihrer Terminalsitzung ausgeführt wurde.
Ilkkachu
Ich bin in einer Anmeldeshell und dieses Verhalten tritt auch bei einem Aufruf von <code> logout </ code> auf. In meinem <code> ~ / .bash_logout </ code> habe ich eine Zeile
arie64
<code> find -xdev / (-name * ~ -o -name ./*~ -o -name core) -exec \ rm '{}' /; </ code> was nach dem Auskommentieren den Fehler nicht macht auftreten. Ich denke, die Kommentare waren korrekt. Diese Zeile versucht, temporäre Dateien zu löschen. Vielen Dank!
Arie64
4
@ arie64 - "<code>" funktioniert in Kommentaren nicht. Verwenden Sie vor und nach dem Code das Anführungszeichen " ` " , um den Code in Kommentaren zu SE anzugeben . Wie: `find -xdev ...` zu bekommen find -xdev ....
Kevin Fegan
25

man bash

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

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):

$ bash
$ trap "rm filetodelete" EXIT

Zeige definierte EXIT-Falle:

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

Prüfung:

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

Beachten Sie, dass exitdies implizit auch "aufgerufen" werden kann. Also statt exitdu hättest auch die Falle durch auslösen können kill -HUP $$.

rudimeier
quelle
Es lohnt sich darauf hinzuweisen type -a exit-> exit is a shell builtinist, wie Sie die Bash-Manpage lesen (oder help exitanstelle von man ausführen ).
Peter Cordes
10

Der exitBefehl 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 EXITFallen von der Shell ausgeführt , sofern vorhanden. Siehe die Ausgabe von trap(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_logoutund möglicherweise diejenigen entsprechen , die in /etcan der Schale abhängig .

Sie können set -xvor dem Aufruf exiteine Aktion ausführen, um eine Vorstellung davon zu erhalten, von wo aus diese Befehle ausgeführt werden.

Stéphane Chazelas
quelle
Großartiger Rat zum Debuggen mitset -x
Glenn Jackman
Sie können ein Protokoll der set -xAusgabe abrufen, indem Sie entweder bash so ausführen, dass das Terminal nach dem Beenden nicht gelöscht oder geschlossen wird, oder indem Sie dies tun set -xund exec &> exit_log.txtdann blind eingeben exit.
Peter Cordes
3

exitist ein "eingebautes" Kommando von bash, also kein Wunder, dass es nicht man exithilft.

Die richtige Dokumentation erhalten Sie auf den Handbuchseiten man bashoder mit dem eingebauten Befehl 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.
$

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

Michel Billaud
quelle