
Может ли кто-нибудь объяснить, как эта 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
или с помощью встроенной команды help
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.
$
Если выДействительнохочу знатькакэто работает, посмотрите на источник:http://git.savannah.gnu.org/cgit/bash.git/tree/builtins/exit.def?h=bash-4.4