Como funciona o comando exit em um terminal Unix?

Como funciona o comando exit em um terminal Unix?

Alguém poderia explicar como o exitcomando funciona no terminal Unix?

Uma pesquisa em man exite which exitnão foi útil e me deparei com o seguinte problema.

Depois de instalar pacotes adicionais para Anaconda e PyCharm em meu novo sistema Red Hat, percebi que sempre que eu ligava exitpara sair de uma sessão de terminal, recebia uma série de erros e então o terminal fechava conforme o esperado. Os erros parecem sugerir que minha chamada exitestá acionando uma chamada rm ~/anaconda3/.../e rm ~/PyCharm/...., causando um erro. Todos os diretórios também parecem ser os locais dos pacotes que baixei para esses programas (ou seja, numpy), veja abaixo.

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

Resolvido

No meu ~/.bash_logoutarquivo, havia uma linha

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

Comentar esta linha interrompeu as mensagens de erro. Parece pesquisar e excluir todos os arquivos temporários. Mas também tenta encontrar diretórios com a palavra “core” e excluí-los também. Esta era uma predefinição no sistema.

Responder1

man bash

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

Essas armadilhas são frequentemente usadas para limpar arquivos tmp na saída, consulte https://stackoverflow.com/questions/687014/removing-created-temp-files-in-unexpected-bash-exit

Defina uma armadilha de saída como esta (para melhores testes em um novo shell):

$ bash
$ trap "rm filetodelete" EXIT

Mostrar armadilha EXIT definida:

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

Teste:

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

Observe que isso exittambém pode ser "chamado" implicitamente. Então, em vez de exitvocê também poderia ter acionado a armadilha por kill -HUP $$.

Responder2

Bem, normalmente você só veria a execução ao sair de um shell se tivesse configurado isso manualmente. Mas talvez um dos pacotes que você instalou veio com um script de shell de saída do bash...

verificar;

~/.bash_logout

talvez você encontre uma chamada de script de lá, é estranha ...

Responder3

O exitcomando é especialconstruídas emcomando em shells. Ele deve ser integrado, pois precisa sair do processo shell.

Ele sai do shell com o status de saída fornecido, se houver, ou o do último comando, caso contrário.

Ao sair, o shell executará as EXITarmadilhas, se houver. Veja a saída de trap(em shells do tipo Bourne) para os configurados atualmente.

Com muitos shells, se o shell foi invocado como um shell de login (alguns sistemas/usuários configuram emuladores de terminal para iniciar um shell de login), ele também executará o código armazenado em arquivos especiais como ~/.logout, e possivelmente os correspondentes, ~/.zlogoutdependendo do shell .~/.bash_logout/etc

Você poderia fazer um set -xantes de ligar exitpara ter uma ideia de onde esses comandos estão sendo executados.

Responder4

exité um comando "integrado" do bash, então não é de admirar man exitque não ajude.

A documentação adequada pode ser obtida nas páginas de manual man bashou com o comando interno helpdo 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 vocêrealmentequer sabercomofunciona, dê uma olhada na fonte:http://git.savannah.gnu.org/cgit/bash.git/tree/builtins/exit.def?h=bash-4.4

informação relacionada