Як працює команда вихід на терміналі Unix?


14

Невже хтось може пояснити, як 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" в них та видалити їх також. Це було встановлено в системі.


Просто для уточнення: ви хочете сказати, що після встановлення додавання на пакунки для 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 ...

перевірити;

~ / .bash_logout

можливо, ви знайдете скрипт-дзвінок звідти, це дивний ...


ОП говорив не про вихід, а про вихід із оболонки.
контрмоде

1
@countermode, вони також не заявляли, що це не оболонка для входу, що працює в їх термінальному сеансі.
ilkkachu

Я перебуваю в оболонці для входу, і така поведінка також відбувається із закликом <code> вихід </code>. У моєму <code> ~ / .bash_logout </code> у мене є рядок
arie64

<code> find -xdev / (-name * ~ -o -name ./*~ -o -name core) -exec \ rm '{}' /; </code>, що після коментування помилка не трапляються. Тому я думаю, що коментарі там, де правильні, цей рядок намагається видалити тимчасові файли. Дякую!
arie64

4
@ arie64 - "<code>" не працює в коментарях. Щоб вказати код у коментарях до SE, використовуйте " " "(наголос на могилі / зліва-одноцитата) до і після коду. Як: `знайти -xdev ...` дістати find -xdev ....
Кевін Феган

25

man bash

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

Такі пастки часто використовуються для очищення tmpfiles при виході, див. Https://stackoverflow.com/questions/687014/removing-create-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 $$.


Варто зазначити type -a exit-> exit is a shell builtinце те, як ви в першу чергу читаєте сторінку bash man (або бігаєте help exitзамість людини).
Пітер Кордес,

10

exitКоманда спеціальний вбудований команди в оболонках. Він повинен бути вбудованим, оскільки він повинен вийти з процесу оболонки.

Він виходить з оболонки зі статусом виходу, наданим, якщо будь-яка чи та остання команда є іншою.

Після виходу оболонка запустить EXITпастки, якщо такі є. Дивіться висновок trap(в оболонках Борна) для поточно встановлених.

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

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


Прекрасна порада для налагодження зset -x
glenn jackman

Ви можете отримати журнал 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.