Comment fonctionne la commande exit sur un terminal Unix?

14

Quelqu'un pourrait-il expliquer comment fonctionne la exitcommande dans le terminal Unix?

Une recherche man exit et which exitn'a pas été utile et j'ai rencontré le problème suivant.

Après avoir installé des modules complémentaires pour Anaconda et PyCharm sur mon nouveau système Red Hat, j'ai remarqué que chaque fois que j'appelais exitpour quitter une session de terminal, j'obtenais une série d'erreurs, puis le terminal se fermait comme prévu. Les erreurs semblent suggérer que mon appel à exitdéclenche un appel rm ~/anaconda3/.../et rm ~/PyCharm/....provoque une erreur. Tous les répertoires semblent également être les emplacements des packages que j'ai téléchargés pour ces programmes (ie numpy), voir ci-dessous.

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

Résolu

Dans mon ~/.bash_logoutdossier, il y avait une ligne

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

En commentant cette ligne, les messages d'erreur ont été arrêtés. Il semble rechercher et supprimer tous les fichiers temporaires. Mais il essaie également de trouver des répertoires contenant le mot «core» et de les supprimer également. C'était un préréglage dans le système.

arie64
la source
Juste pour clarifier: êtes-vous en train de dire que, après avoir installé des modules complémentaires pour Anaconda et PyCharm, vous obtenez une série d'erreurs lorsque vous utilisez exitpour quitter cette session de terminal - ou que cela se produit chaque fois que vous utilisez exitaprès cela?
G-Man dit `` Réintègre Monica ''
1
Cela s'est produit pour chaque session de terminal après avoir installé ces modules complémentaires.
arie64
1
Très étrange, avez-vous déjà vérifié s'il exits'agit d'un alias?
Dominique
3
La raison pour laquelle il essaie de supprimer des corefichiers est parce que ce sont généralement des fichiers de vidage sur incident (vidages principaux ) qui prennent de la place mais sont rarement utiles à moins que vous ne développiez le logiciel en panne. Dans ce cas, il essaie de supprimer un répertoire nommé core, qui échoue (et c'est une bonne chose qu'il échoue - numpy.coreest essentiel à NumPy!).
nneonneo
De nos jours, la plupart des systèmes sont configurés pour ne pas écrire les vidages de mémoire par défaut (en définissant la valeur par ulimit -c 0défaut). Cette find -exec rmcommande n'est pas quelque chose que je souhaiterais de toute façon, mais vous pouvez y ajouter quelque chose -type f. Vous pouvez également le rendre beaucoup plus efficace en supprimant plusieurs fichiers en utilisant -exec rm {} +au lieu de ... \;, de sorte qu'il regroupe plusieurs arguments sur une seule rmligne de commande (comme xargs)
Peter Cordes

Réponses:

20

Eh bien, généralement, vous ne verrez l'exécution qu'à la sortie d'un shell si vous l'avez configuré manuellement. Mais peut-être que l'un des packages que vous avez installés est fourni avec un script shell de sortie bash ...

vérifier;

~ / .bash_logout

peut-être que vous trouverez un appel de script à partir de là, c'est étrange ...

mikejonesey
la source
L'OP ne parlait pas de déconnexion mais de sortie d'un shell.
contre-mode
1
@countermode, ils n'ont pas non plus déclaré que ce n'était pas un shell de connexion qui s'exécutait dans leur session de terminal.
ilkkachu
Je suis dans un shell de connexion et ce problème se produit également avec un appel à <code> logout </code>. Dans mon <code> ~ / .bash_logout </code> j'ai une ligne
arie64
<code> trouver -xdev / (-name * ~ -o -name ./*~ -o -name core) -exec \ rm '{}' /; </code> qui, après avoir commenté, l'erreur ne se corrige pas se produire. Je pense donc que les commentaires étaient corrects, cette ligne tente de supprimer les fichiers temporaires. Je vous remercie!
arie64
4
@ arie64 - "<code>" ne fonctionne pas dans les commentaires. Pour indiquer le code dans les commentaires sur SE, utilisez le " ` "(accent grave / guillemet simple gauche) avant et après le code. Comme: `trouver -xdev ...` pour obtenir find -xdev ....
Kevin Fegan
25

man bash

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

Ces pièges sont souvent utilisés pour nettoyer les fichiers tmp à la sortie, voir /programming/687014/removing-created-temp-files-in-unexpected-bash-exit

Définissez un piège de sortie comme celui-ci (pour de meilleurs tests dans un nouveau shell):

$ bash
$ trap "rm filetodelete" EXIT

Afficher le piège EXIT défini:

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

Tester:

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

Notez que cela exitpeut aussi être "appelé" implicitement. Donc, au lieu de exitvous, vous auriez également pu déclencher le piège kill -HUP $$.

rudimeier
la source
Il convient de souligner type -a exit-> exit is a shell builtinest la façon dont vous savez lire la page de manuel bash (ou exécuter à la help exitplace de man) en premier lieu.
Peter Cordes
10

La exitcommande est une commande intégrée spéciale dans les coquilles. Il doit être intégré car il doit quitter le processus shell.

Il quitte le shell avec le statut de sortie fourni le cas échéant ou celui de la dernière commande sinon.

À sa sortie, le shell exécutera les EXITpièges, le cas échéant. Voir la sortie de trap(dans les shells de type Bourne) pour ceux actuellement définis.

Avec beaucoup de coquilles, si la coquille a été invoquée comme un shell de connexion (certains systèmes / utilisateurs de configurer les émulateurs de terminal pour démarrer un shell de connexion), il sera également exécuter le code stocké dans des fichiers spéciaux comme ~/.logout, ~/.zlogout, ~/.bash_logoutet éventuellement ceux correspondant à/etc fonction de la coquille .

Vous pouvez faire un set -xavant d'appeler exitpour avoir une idée d'où ces commandes sont exécutées.

Stéphane Chazelas
la source
Excellent conseil pour déboguer avecset -x
Glenn Jackman
Vous pouvez obtenir un journal de la set -xsortie en exécutant bash d'une manière qui n'effacera pas ou ne fermera pas le terminal après sa sortie, ou peut-être en le faisant set -x, exec &> exit_log.txtpuis en tapant aveuglément exit.
Peter Cordes
3

exitest une commande "basique" de bash, donc pas étonnant que cela man exitn'aide pas.

Une documentation appropriée peut être obtenue à partir des pages de manuel man bash, ou avec la commande intégrée helpde 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.
$

Si vous voulez vraiment savoir comment cela fonctionne, consultez la source: http://git.savannah.gnu.org/cgit/bash.git/tree/builtins/exit.def?h=bash-4.4

Michel Billaud
la source