Quelqu'un pourrait-il expliquer comment fonctionne la exit
commande dans le terminal Unix?
Une recherche man exit
et which exit
n'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 exit
pour 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 à exit
dé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_logout
dossier, 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.
la source
exit
pour quitter cette session de terminal - ou que cela se produit chaque fois que vous utilisezexit
après cela?exit
s'agit d'un alias?core
fichiers 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.core
est essentiel à NumPy!).ulimit -c 0
défaut). Cettefind -exec rm
commande 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 seulerm
ligne de commande (comme xargs)Réponses:
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;
peut-être que vous trouverez un appel de script à partir de là, c'est étrange ...
la source
find -xdev ...
.man bash
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):
Afficher le piège EXIT défini:
Tester:
Notez que cela
exit
peut aussi être "appelé" implicitement. Donc, au lieu deexit
vous, vous auriez également pu déclencher le piègekill -HUP $$
.la source
type -a exit
->exit is a shell builtin
est la façon dont vous savez lire la page de manuel bash (ou exécuter à lahelp exit
place de man) en premier lieu.La
exit
commande 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
EXIT
pièges, le cas échéant. Voir la sortie detrap
(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_logout
et éventuellement ceux correspondant à/etc
fonction de la coquille .Vous pouvez faire un
set -x
avant d'appelerexit
pour avoir une idée d'où ces commandes sont exécutées.la source
set -x
set -x
sortie 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 faisantset -x
,exec &> exit_log.txt
puis en tapant aveuglémentexit
.exit
est une commande "basique" de bash, donc pas étonnant que celaman exit
n'aide pas.Une documentation appropriée peut être obtenue à partir des pages de manuel
man bash
, ou avec la commande intégréehelp
de bash (help exit
).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
la source