Como o comando exit funciona em um terminal Unix?

14

Alguém poderia explicar como o comando exit funciona no terminal do Unix?

Uma pesquisa de man exit e which exit não foi útil e eu me deparei com o seguinte problema.

Depois de instalar pacotes adicionais para o Anaconda e o PyCharm no meu novo sistema Red Hat, notei que quando eu chamava exit para sair de uma sessão de terminal, eu recebia uma série de erros e o terminal fechava como esperado . Os erros parecem sugerir que minha chamada para exit está 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 arquivo ~/.bash_logout , havia uma linha

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

Comentar esta linha de saída parou as mensagens de erro. Parece procurar e excluir todos os arquivos temporários. Mas também tenta encontrar diretórios com a palavra "core" neles e também os exclui. Esta foi uma predefinição no sistema.

    
por arie64 24.10.2016 / 23:07

4 respostas

20

Normalmente, você só verá a execução ao sair de um shell se tiver configurado isso manualmente. Mas talvez um dos pacotes que você instalou tenha vindo com um script de shell de saída bash ...

verifique;

~/.bash_logout

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

    
por 24.10.2016 / 23:17
25

man bash

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

Tais armadilhas são frequentemente usadas para limpar tmpfiles na saída, veja link

Defina uma armadilha de saída como essa (para melhor testar 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 exit pode ser "chamado" implicitamente também. Então, em vez de exit , você também pode ter acionado a interceptação por kill -HUP $$ .

    
por 24.10.2016 / 23:20
10

O comando exit é um comando especial embutido em shells. Ele precisa estar embutido, já que precisa sair do processo de shell.

Ele sai do shell com o status de saída fornecido, se algum ou aquele do último comando, de outra forma.

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

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 , ~/.zlogout , ~/.bash_logout e possivelmente os correspondentes em /etc dependendo do shell.

Você pode fazer um set -x antes de chamar exit para ter uma ideia de onde esses comandos estão sendo executados.

    
por 25.10.2016 / 13:13
3

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

A documentação apropriada pode ser obtida nas páginas de manual man bash , ou com o comando incorporado help do 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ê realmente quiser saber como funciona, dê uma olhada na fonte: link

    
por 25.10.2016 / 12:23