Alguém poderia explicar como o exit
comando funciona no terminal Unix?
Uma pesquisa man exit
e which exit
não foi útil e me deparei com o seguinte problema.
Depois de instalar os pacotes add-on para Anaconda e PyCharm no meu novo sistema Red Hat, notei que sempre que telefonava exit
para sair de uma sessão do terminal, recebia uma série de erros e o terminal fecha como esperado. Os erros parecem sugerir que minha chamada para exit
está acionando 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 (por exemplo, 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 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 excluí-los também. Esta foi uma predefinição no sistema.
fonte
exit
para sair do que sessão de terminal - ou que isso acontece cada vez que você usaexit
depois disso?exit
é um apelido?core
arquivos é porque eles geralmente são arquivos de despejo de memória ( core dumps ) que ocupam espaço, mas raramente são úteis, a menos que você esteja desenvolvendo o software com falha. Nesse caso, ele está tentando excluir um diretório chamadocore
, que falha (e é bom que falhe -numpy.core
é essencial para o NumPy!).ulimit -c 0
o padrão). De qualquer forma, essefind -exec rm
comando não é algo que eu gostaria, mas você pode adicionar-type f
a ele. Você também pode tornar muito mais eficiente a exclusão de vários arquivos usando em-exec rm {} +
vez de... \;
, para que ele agrupe vários argumentos em umarm
linha de comando (como xargs)Respostas:
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 tenha um script shell de saída do bash ...
Verifica;
talvez você encontre uma chamada de script de lá, é estranha ...
fonte
find -xdev ...
.man bash
Esses traps são frequentemente usados para limpar arquivos tmp na saída, consulte /programming/687014/removing-created-temp-files-in-unexpected-bash-exit
Defina uma armadilha de saída como esta (para melhores testes em um novo shell):
Mostrar armadilha EXIT definida:
Teste:
Observe que também
exit
pode ser "chamado" implicitamente. Então, em vez deexit
você também poderia ter desencadeado a armadilhakill -HUP $$
.fonte
type -a exit
->exit is a shell builtin
é como você sabe ler a página do manual do bash (ou executar emhelp exit
vez do man) em primeiro lugar.O
exit
comando é um especial built-in comando em conchas. Ele precisa ser incorporado, pois precisa sair do processo do shell.Ele sai do shell com o status de saída fornecido, se houver algum ou aquele do último comando.
Ao sair, o shell executará as
EXIT
armadilhas, se houver. Veja a saída detrap
(em cascas semelhantes a Bourne) para as atualmente definidas.Com muitas conchas, se o shell foi invocado como um shell de login (alguns sistemas / usuários configurar emuladores de terminal para iniciar um shell de login), que também irá executar o código armazenado em arquivos especiais, como
~/.logout
,~/.zlogout
,~/.bash_logout
e aqueles possivelmente correspondente/etc
dependendo do shell .Você pode fazer uma
set -x
chamada antesexit
para ter uma idéia de onde esses comandos estão sendo executados.fonte
set -x
set -x
saída executando o bash de uma maneira que não limpe ou feche o terminal após a saída, ou talvez o façaset -x
,exec &> exit_log.txt
e digite cegamenteexit
.exit
é um comando "interno" do bash, portanto, não é de admirar que isso nãoman exit
ajude.A documentação adequada pode ser obtida nas páginas de manual
man bash
ou com o comando internohelp
do bash (help exit
).Se você realmente deseja saber como isso funciona, consulte a fonte: http://git.savannah.gnu.org/cgit/bash.git/tree/builtins/exit.def?h=bash-4.4
fonte