Como o comando exit funciona em um terminal Unix?

14

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

Uma pesquisa man exit e which exitnã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 exitpara 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 exitestá 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_logoutarquivo, 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.

arie64
fonte
Apenas para esclarecer: você está dizendo que, depois de instalar os pacotes add para Anaconda e PyCharm, você recebe uma série de erros ao usar exit para sair do que sessão de terminal - ou que isso acontece cada vez que você usa exitdepois disso?
G-Man diz 'Reinstate Monica'
1
Isso ocorreu em todas as sessões do terminal após a instalação desses pacotes adicionais.
Arie64 # 25/16
1
Muito estranho, você já verificou se exité um apelido?
Dominique
3
A razão pela qual ele tenta excluir corearquivos é 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 chamado core, que falha (e é bom que falhe - numpy.coreé essencial para o NumPy!).
N15:
Atualmente, a maioria dos sistemas está configurada para não gravar dumps principais por padrão (tornando ulimit -c 0o padrão). De qualquer forma, esse find -exec rmcomando não é algo que eu gostaria, mas você pode adicionar -type fa 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 uma rmlinha de comando (como xargs)
Peter Cordes

Respostas:

20

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;

~ / .bash_logout

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

mikejonesey
fonte
O OP não estava falando sobre logout, mas sobre sair de um shell.
Countermode #
1
@countermode, eles também não declararam que não era um shell de logon em execução na sessão do terminal.
Ilkkachu
Estou em um shell de logon e esse comportamento também ocorre com uma chamada para <code> logout </code>. Na minha <code> ~ / .bash_logout </ code> Eu tenho uma linha
arie64
<code> encontre -xdev / (-name * ~ -o -name ./*~ -o -name core) -exec \ rm '{}' /; </code> que, após comentar, o erro não ocorrer. Então, acho que os comentários, quando corretos, esta linha está tentando excluir arquivos temporários. Obrigado!
Arie64 # 25/16
4
@ arie64 - "<code>" não funciona nos comentários. Para indicar o código nos comentários do SE, use o " ` "(Sotaque grave / Aspa simples à esquerda) antes e depois do código. Como: `encontre -xdev ...` para obter find -xdev ....
Kevin Fegan
25

man bash

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

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):

$ 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 também exitpode ser "chamado" implicitamente. Então, em vez de exitvocê também poderia ter desencadeado a armadilha kill -HUP $$.

rudimeier
fonte
Vale ressaltar type -a exit-> exit is a shell builtiné como você sabe ler a página do manual do bash (ou executar em help exitvez do man) em primeiro lugar.
Peter Cordes
10

O exitcomando é 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 EXITarmadilhas, se houver. Veja a saída de trap(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_logoute aqueles possivelmente correspondente /etcdependendo do shell .

Você pode fazer uma set -xchamada antes exitpara ter uma idéia de onde esses comandos estão sendo executados.

Stéphane Chazelas
fonte
Grande conselho para depuração comset -x
glenn jackman
Você pode obter um log da set -xsaída executando o bash de uma maneira que não limpe ou feche o terminal após a saída, ou talvez o faça set -x, exec &> exit_log.txte digite cegamente exit.
Peter Cordes
3

exité um comando "interno" do bash, portanto, não é de admirar que isso não man exitajude.

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ê 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

Michel Billaud
fonte