Come funziona il comando exit su un terminale Unix?


14

Qualcuno potrebbe spiegare come funziona il exitcomando nel terminale Unix?

Una ricerca di man exit e which exitnon è stata utile e ho riscontrato il seguente problema.

Dopo aver installato i pacchetti aggiuntivi per Anaconda e PyCharm sul mio nuovo sistema Red Hat, ho notato che quando avessi chiamato exitper uscire da una sessione terminale avrei ricevuto una serie di errori, quindi il terminale si chiudeva come previsto. Gli errori sembrano suggerire che la mia chiamata a exitsta innescando una chiamata rm ~/anaconda3/.../e rm ~/PyCharm/....causando un errore. Tutte le directory sembrano anche essere le posizioni dei pacchetti che ho scaricato per questi programmi (cioè numpy), vedi sotto.

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

risoluto

Nel mio ~/.bash_logoutfile c'era una linea

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

Commentando questa riga, i messaggi di errore sono stati interrotti. Sembra cercare ed eliminare tutti i file temporanei. Ma tenta anche di trovare directory con la parola "core" in esse, ed eliminare anche quelle. Questo era un preset nel sistema.


Solo per chiarire: stai dicendo che, dopo l'installazione di aggiungere pacchetti per Anaconda e PyCharm, ricevi una serie di errori quando usi exitper uscire da quella sessione del terminale - o che succede ogni volta che lo usi exitdopo?
G-Man dice "Reinstate Monica" il

1
Si è verificato per ogni sessione del terminale dopo aver installato questi pacchetti aggiuntivi.
arie64,

1
Molto strano, hai già verificato se exitè un alias?
Dominique,

3
Il motivo per cui tenta di eliminare i corefile è perché si tratta in genere di file crashdump ( core dump ) che occupano spazio ma sono raramente utili se non si sta sviluppando il software in crash. In questo caso sta tentando di eliminare una directory denominata core, che fallisce (e buona cosa fallisce - numpy.coreè essenziale per NumPy!).
nneonneo,

La maggior parte dei sistemi in questi giorni sono configurati per non scrivere core dump per impostazione predefinita (impostando ulimit -c 0l'impostazione predefinita). Quel find -exec rmcomando non è qualcosa che vorrei comunque, ma potresti aggiungerlo -type f. Puoi anche renderlo molto più efficiente eliminando più file usando -exec rm {} +invece di ... \;, quindi raggruppa più arg su una rmriga di comando (come xargs)
Peter Cordes,

Risposte:


20

Bene, di solito vedresti l'esecuzione solo all'uscita da una shell se l'hai configurata manualmente. Ma forse uno dei pacchetti che hai installato è arrivato con uno script shell di uscita bash ...

dai un'occhiata;

~ / .Bash_logout

forse troverai una chiamata da lì, è una strana ...


L'OP non stava parlando del logout ma dell'uscita da una shell.
Contromodalità

1
@countermode, inoltre, non hanno dichiarato che non era una shell di accesso in esecuzione nella loro sessione terminale.
ilkkachu,

Sono in una shell di accesso e questo comportamento si verifica anche con una chiamata a <code> logout </code>. Nel mio <code> ~ / .bash_logout </code> ho una riga
arie64

<code> trova -xdev / (-name * ~ -o -name ./*~ -o -name core) -exec \ rm '{}' /; </code> che, dopo aver commentato, l'errore non si verificano. Quindi penso che i commenti siano corretti, questa riga sta cercando di eliminare i file temporanei. Grazie!
arie64,

4
@ arie64 - "<code>" non funziona nei commenti. Per indicare il codice nei commenti su SE, usa " " "(accento grave / virgoletta singola sinistra) prima e dopo il codice. Come: `find -xdev ...` per ottenere find -xdev ....
Kevin Fegan,

25

man bash

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

Tali trappole vengono spesso utilizzate per ripulire i file tmp all'uscita, vedere /programming/687014/removing-created-temp-files-in-unexpected-bash-exit

Definire una trappola di uscita come questa (per test migliori in una nuova shell):

$ bash
$ trap "rm filetodelete" EXIT

Mostra trappola EXIT definita:

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

Test:

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

Si noti che exitpotrebbe anche essere "chiamato" implicitamente. Quindi invece di exitte avresti potuto anche attivare la trappola kill -HUP $$.


Vale la pena sottolineare type -a exit-> exit is a shell builtinè come sai leggere la pagina man di bash (o eseguire help exitinvece di man) in primo luogo.
Peter Cordes,

10

Il exitcomando è uno speciale comando integrato nelle shell. Deve essere integrato in quanto deve uscire dal processo di shell.

Esce dalla shell con lo stato di uscita fornito se presente o uno dell'ultimo comando in caso contrario.

All'uscita, la shell eseguirà le EXITtrappole, se presenti. Vedi l'output di trap(in shell tipo Bourne) per quelli attualmente impostati.

Con molte conchiglie, se la shell è stata invocata come una shell di login (alcuni sistemi / utenti configurano emulatori di terminale per avviare una shell di login), sarà anche eseguire il codice memorizzato nel file speciali come ~/.logout, ~/.zlogout, ~/.bash_logoute quelli eventualmente corrispondente /etca seconda della shell .

set -xPrima di chiamare, potresti fare un tentativo exitper avere un'idea della provenienza di tali comandi.


Ottimo consiglio per il debug conset -x
Glenn Jackman,

È possibile ottenere un registro set -xdell'output eseguendo bash in un modo che non cancelli o chiuda il terminale dopo la sua uscita, o forse facendo set -x, exec &> exit_log.txtquindi digitare alla cieca exit.
Peter Cordes,

3

exitè un comando "incorporato" di bash, quindi nessuna meraviglia man exitnon aiuta.

È possibile ottenere la documentazione corretta dalle pagine del manuale man basho con il comando incorporato helpdi 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.
$

Se vuoi davvero sapere come funziona, dai un'occhiata alla fonte: http://git.savannah.gnu.org/cgit/bash.git/tree/builtins/exit.def?h=bash-4.4

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.