
Alguém poderia explicar como o exit
comando funciona no terminal Unix?
Uma pesquisa em man exit
e which exit
nã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 exit
para 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 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 ~/.bash_logout
arquivo, 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 exit
também pode ser "chamado" implicitamente. Então, em vez de exit
você 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 exit
comando é 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 EXIT
armadilhas, 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, ~/.zlogout
dependendo do shell .~/.bash_logout
/etc
Você poderia fazer um set -x
antes de ligar exit
para 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 exit
que não ajude.
A documentação adequada pode ser obtida nas páginas de manual man bash
ou com o comando interno 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êrealmentequer sabercomofunciona, dê uma olhada na fonte:http://git.savannah.gnu.org/cgit/bash.git/tree/builtins/exit.def?h=bash-4.4