Как работает команда выхода на терминале Unix?

Как работает команда выхода на терминале Unix?

Может ли кто-нибудь объяснить, как эта exitкоманда работает в терминале Unix?

Поиск по man exitи which exitне помог, и я столкнулся со следующей проблемой.

После установки дополнительных пакетов для Anaconda и PyCharm на моей новой системе Red Hat я заметил, что когда я вызываю exitвыход из сеанса терминала, я получаю ряд ошибок, а затем терминал завершает работу, как и ожидалось. Ошибки, похоже, указывают на то, что мой вызов exitзапускает вызов rm ~/anaconda3/.../и rm ~/PyCharm/...., вызывая ошибку. Все каталоги также, по-видимому, являются местоположениями пакетов, которые я скачал для этих программ (например, numpy), см. ниже.

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

Решено

В моем ~/.bash_logoutфайле была строка

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

Закомментировав эту строку, мы остановили сообщения об ошибках. Похоже, что он ищет и удаляет все временные файлы. Но он также пытается найти каталоги со словом "core" в них и удалить их. Это было предустановлено в системе.

решение1

man bash

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

Такие ловушки часто используются для очистки tmpfiles при выходе, см. https://stackoverflow.com/questions/687014/removing-created-temp-files-in-unexpected-bash-exit

Определите выходную ловушку следующим образом (для лучшего тестирования в новой оболочке):

$ bash
$ trap "rm filetodelete" EXIT

Показать определенную ловушку EXIT:

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

Тест:

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

Обратите внимание, что это exitможет быть "вызвано" неявно тоже. Так что вместо exitвы могли бы также вызвать ловушку с помощью kill -HUP $$.

решение2

Ну, обычно вы увидите выполнение только при выходе из оболочки, если вы вручную настроили это. Но, возможно, один из установленных вами пакетов поставляется со скриптом выхода из оболочки bash...

проверять;

~/.bash_logout

может быть, вы найдете там сценарий вызова, он странный...

решение3

Команда exitявляется специальнойвстроенныйкоманда в оболочках. Она должна быть встроенной, так как ей нужно выйти из процесса оболочки.

Он выходит из оболочки с указанным статусом выхода, если таковой имеется, или со статусом последней команды в противном случае.

При выходе оболочка запустит ловушки, EXITесли таковые имеются. Смотрите вывод trap(в оболочках типа Bourne) для текущих установленных ловушек.

Во многих оболочках, если оболочка была вызвана как оболочка входа в систему (некоторые системы/пользователи настраивают эмуляторы терминала для запуска оболочки входа в систему), она также запустит код, хранящийся в специальных файлах, таких как ~/.logout, ~/.zlogout, ~/.bash_logoutи, возможно, соответствующих им в /etcзависимости от оболочки.

Вы можете сделать set -xзапрос перед вызовом exit, чтобы получить представление о том, откуда запускаются эти команды.

решение4

exitэто «встроенная» команда bash, так что no wonder man exitне поможет.

Соответствующую документацию можно получить из страниц руководства man bashили с помощью встроенной команды helpbash ( 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.
$

Если выДействительнохочу знатькакэто работает, посмотрите на источник:http://git.savannah.gnu.org/cgit/bash.git/tree/builtins/exit.def?h=bash-4.4

Связанный контент