¿Cómo funciona el comando de salida en un terminal Unix?

14

¿Podría alguien explicar cómo funciona el exitcomando en la terminal Unix?

Una búsqueda de man exit y which exitno fue útil y me encontré con el siguiente problema.

Después de instalar paquetes adicionales para Anaconda y PyCharm en mi nuevo sistema Red Hat, noté que cada vez que llamaba exitpara salir de una sesión de terminal recibía una serie de errores, y luego el terminal se cierra como se esperaba. Los errores parecen sugerir que mi llamada a exitestá activando una llamada rm ~/anaconda3/.../y está rm ~/PyCharm/....causando un error. Todos los directorios también parecen ser las ubicaciones de los paquetes que descargué para estos programas (es decir, numpy), ver más abajo.

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

Resuelto

En mi ~/.bash_logoutarchivo, había una línea

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

Al comentar esta línea, se detuvieron los mensajes de error. Parece buscar y eliminar todos los archivos temporales. Pero también intenta encontrar directorios con la palabra "núcleo" en ellos, y eliminarlos también. Este era un preajuste en el sistema.

arie64
fuente
Solo para aclarar: ¿está diciendo que, después de instalar paquetes adicionales para Anaconda y PyCharm, obtiene una serie de errores cuando exitsale de esa sesión de terminal, o eso sucede cada vez que lo usa exit?
G-Man dice 'Reincorporar a Monica' el
1
Se ha producido para cada sesión de terminal después de instalar estos paquetes adicionales.
arie64
1
Muy extraño, ¿ya verificaste si exites un alias?
Dominique
3
La razón por la que intenta eliminar corearchivos es porque generalmente son archivos de volcado de memoria ( volcados de núcleo ) que ocupan espacio pero rara vez son útiles a menos que esté desarrollando el software de bloqueo. En este caso, está intentando eliminar un directorio llamado core, que falla (y lo bueno es que falla, ¡ numpy.corees esencial para NumPy!).
nneonneo
La mayoría de los sistemas en estos días están configurados para no escribir volcados de núcleo de forma predeterminada (haciendo ulimit -c 0el valor predeterminado) Ese find -exec rmcomando no es algo que quisiera de todos modos, pero podría agregarlo -type f. También puede hacer que sea mucho más eficiente eliminar múltiples archivos mediante el uso en -exec rm {} +lugar de ... \;, por lo que agrupa varios argumentos en una rmlínea de comando (como xargs)
Peter Cordes

Respuestas:

20

Por lo general, solo vería la ejecución al salir de un shell si ha configurado esto manualmente. Pero tal vez uno de los paquetes que ha instalado viene con un script de shell de salida bash ...

cheque;

~ / .bash_logout

tal vez encuentres una llamada de guión desde allí, es extraña ...

mikejonesey
fuente
El OP no hablaba de cerrar sesión sino de salir de un shell.
contramodo
1
@countermode, tampoco dijeron que no era un shell de inicio de sesión que se estaba ejecutando en su sesión de terminal.
ilkkachu
Estoy en un shell de inicio de sesión y este comportamiento también ocurre con una llamada a <code> logout </code>. En mi <code> ~ / .bash_logout </code> tengo una línea
arie64 el
<code> find -xdev / (-name * ~ -o -name ./*~ -o -name core) -exec \ rm '{}' /; </code> que, después de comentar, el error no aparece ocurrir. Así que creo que los comentarios fueron correctos, esta línea está tratando de eliminar archivos temporales. ¡Gracias!
arie64
44
@ arie64 - "<código>" no funciona en los comentarios. Para indicar el código dentro de los comentarios en SE, use el " ` "(acento grave / comilla simple izquierda) antes y después del código. Como: `encontrar -xdev ...` para obtener find -xdev ....
Kevin Fegan
25

man bash

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

Tales trampas se usan a menudo para limpiar archivos tmp en la salida, consulte /programming/687014/removing-created-temp-files-in-unexpected-bash-exit

Defina una trampa de salida como esta (para una mejor prueba en un nuevo shell):

$ bash
$ trap "rm filetodelete" EXIT

Mostrar trampa EXIT definida:

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

Prueba:

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

Tenga en cuenta que también exitse puede "llamar" implícitamente. Entonces, en lugar de exitti, también podrías haber activado la trampa kill -HUP $$.

rudimeier
fuente
Vale la pena señalar type -a exit-> exit is a shell builtines cómo saber leer la página de manual de bash (o ejecutar en help exitlugar de man) en primer lugar.
Peter Cordes
10

El exitcomando es un comando incorporado especial en shells. Tiene que estar incorporado ya que necesita salir del proceso de shell.

Sale del shell con el estado de salida proporcionado, si lo hay, o el del último comando.

Al salir, el shell ejecutará las EXITtrampas si las hay. Vea la salida de trap(en shells tipo Bourne) para los actualmente configurados.

Con muchas conchas, si los depósitos se invocó como un shell de entrada (algunos sistemas / usuarios configurar emuladores de terminal para iniciar un shell de entrada), sino que también ejecute el código almacenado en archivos especiales como ~/.logout, ~/.zlogout, ~/.bash_logouty, posiblemente, los correspondientes en /etcfunción de la concha .

Puede hacer una set -xantes de llamar exitpara tener una idea de dónde se ejecutan esos comandos.

Stéphane Chazelas
fuente
Gran consejo para depurarset -x
Glenn Jackman
Puede obtener un registro de la set -xsalida ejecutando bash de una manera que no borre o cierre el terminal después de que salga, o tal vez al hacerlo set -x, exec &> exit_log.txtluego escriba a ciegas exit.
Peter Cordes
3

exites un comando "incorporado" de bash, por lo que no es de extrañar que man exitno ayude.

Se puede obtener la documentación adecuada de las páginas del manual man basho con el comando incorporado 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 realmente quiere saber cómo funciona, eche un vistazo a la fuente: http://git.savannah.gnu.org/cgit/bash.git/tree/builtins/exit.def?h=bash-4.4

Michel Billaud
fuente