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

14

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

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

После установки пакетов add on для 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 '{}' \;

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

arie64
источник
Просто чтобы уточнить: вы говорите, что после установки пакетов add для Anaconda и PyCharm вы получаете ряд ошибок при exitвыходе из этого терминального сеанса - или это происходит каждый раз, когда вы используете его exitпосле этого?
G-Man говорит: «Восстановите Монику»
1
Это происходило для каждого сеанса терминала после установки этих дополнительных пакетов.
arie64
1
Очень странно, вы уже проверили, exitявляется ли псевдоним?
Доминик
3
Причина, по которой он пытается удалить coreфайлы, заключается в том, что они обычно представляют собой файлы аварийного отключения ( дампы ядра ), которые занимают место, но редко полезны, если вы не разрабатываете программное обеспечение, вызывающее сбой. В этом случае он пытается удалить каталог с именем core, который терпит неудачу (и хорошо, что он терпит неудачу - numpy.coreэто важно для NumPy!).
nneonneo
Большинство систем в наши дни настроены не записывать дампы ядра по умолчанию (делая ulimit -c 0по умолчанию). В find -exec rmлюбом случае, я не хочу эту команду, но вы можете добавить -type fк ней. Вы также можете сделать намного более эффективным удаление нескольких файлов, используя -exec rm {} +вместо этого ... \;, чтобы он объединял несколько аргументов в одну rmкомандную строку (например, xargs)
Питер Кордес

Ответы:

20

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

проверить;

~ / .Bash_logout

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

mikejonesey
источник
ОП говорил не о выходе из системы, а о выходе из оболочки.
контррежим
1
@countermode, они также не утверждали, что это была не оболочка входа в систему, которая работала в их терминальной сессии.
ilkkachu
Я нахожусь в оболочке входа в систему, и это поведение также происходит с вызовом <code> logout </ code>. В моем <code> ~ / .bash_logout </ code> у меня есть строка
arie64
<code> find -xdev / (-name * ~ -o -name ./*~ -o -name core) -exec \ rm '{}' /; </ code>, который после комментирования не приводит к ошибке происходят. Поэтому я думаю, что комментарии там, где это правильно, эта строка пытается удалить временные файлы. Спасибо!
arie64
4
@ arie64 - "<код>" не работает в комментариях. Чтобы указать код в комментариях к SE, используйте « ` »(Grave-accent / Left-single-quote) до и после кода. Как: `найти -xdev ...` чтобы получить find -xdev ....
Кевин Феган,
25

man bash

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

Такие ловушки часто используются для очистки tmp-файлов при выходе, см. 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 $$.

rudimeier
источник
Стоит отметить type -a exit-> exit is a shell builtinэто то, как вы знаете, как читать man-страницу bash (или запускать help exitвместо man) в первую очередь.
Питер Кордес
10

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

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

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

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

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

Стефан Шазелас
источник
Отличный совет для отладкиset -x
Гленн Джекман
Вы можете получить журнал set -xвывода, запустив bash таким образом, чтобы не очистить или не закрыть терминал после его выхода, или, возможно, выполнив set -x, а exec &> exit_log.txtзатем набрать вслепую exit.
Питер Кордес
3

exitэто встроенная команда bash, поэтому неудивительно, что она 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.

Мишель Бийо
источник