종료 명령은 Unix 터미널에서 어떻게 작동합니까?


14

누군가 exit유닉스 터미널에서 명령이 어떻게 작동 하는지 설명해 주 시겠습니까?

검색 man exit 하고 which exit도움이되지 않았으며 다음 문제가 발생했습니다.

새로운 Red Hat 시스템에 Anaconda 및 PyCharm 용 애드온 패키지를 설치 한 후 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-남자 '는 분석 재개 모니카'말한다

1
이 애드온 패키지를 설치 한 후 모든 터미널 세션에서 발생했습니다.
arie64

1
매우 이상합니다. 이미 exit별칭 인지 확인 했습니까?
Dominique

3
core파일 을 삭제하려고하는 이유 는 파일이 공간을 차지하지만 충돌 소프트웨어를 개발하지 않는 한 거의 유용하지 않은 충돌 덤프 파일 ( 코어 덤프 ) 이기 때문 입니다. 이 경우 core실패한 디렉토리를 삭제하려고 시도 합니다 (실패 numpy.core하는 경우 NumPy에 필수적입니다!).
nneonneo

요즘 대부분의 시스템은 기본적으로 코어 덤프를 쓰지 않도록 구성되어 있습니다 ( ulimit -c 0기본값으로 설정). 이 find -exec rm명령은 어쨌든 원하는 것이 아니지만 추가 할 수 있습니다 -type f. -exec rm {} +대신을 사용하여 여러 파일을 삭제하는 것이 훨씬 더 효율적일 수 ... \;있으므로 여러 인수를 하나의 rm명령 줄 (xargs와 같은) 에 일괄 처리 할 수 ​​있습니다.
Peter Cordes

답변:


20

일반적으로 수동으로 구성한 경우 셸을 종료 할 때만 실행됩니다. 그러나 설치 한 패키지 중 하나에 bash exit shell script가 제공되었을 수 있습니다 ...

검사;

~ / .bash_logout

어쩌면 거기에서 스크립트 호출을 찾을 수 있습니다. 이상한 것입니다 ...


OP는 로그 아웃에 대한 것이 아니라 셸 종료에 대해 이야기했습니다.
카운터 모드

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- "<code>"가 주석에서 작동하지 않습니다. SE의 주석 내에 코드를 표시하려면 코드 앞뒤에 " ` "(Grave-accent / Left-single-quote)를 사용하십시오. `find -xdev ...`를 얻는다 find -xdev ....
Kevin Fegan

25

man bash

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

이러한 트랩은 종종 종료시 tmpfile을 정리하는 데 사용됩니다 ( /programming/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 $$.


지적 할 가치 가있는 것은 type -a exit-> exit is a shell builtinbash 맨 페이지를 읽거나 help exit맨 대신 실행 하는 방법입니다.
Peter Cordes

10

exit명령은 쉘 의 특수 내장 명령입니다. 쉘 프로세스를 종료해야하므로 내장되어 있어야합니다.

종료 명령이있는 경우 제공된 종료 상태 또는 마지막 명령의 종료 상태로 쉘을 종료합니다.

종료하면 쉘은 EXIT트랩 을 실행 합니다 (있는 경우). trap현재 설정된 쉘에 대한 출력 (본느 쉘에서)을 참조하십시오 .

쉘이 (일부 시스템 / 사용자가 로그인 쉘을 시작하는 터미널 에뮬레이터를 구성) 로그인 쉘로 호출 된 경우 많은 껍질, 그것은 또한 같은 특수 파일에 저장되어있는 코드를 실행 ~/.logout, ~/.zlogout, ~/.bash_logout아마도에서 사람을 해당 /etc쉘에 따라 .

해당 명령이 실행되는 위치 set -x를 파악 exit하기 위해 호출 하기 전에 수행 할 수 있습니다.


와 디버그 그레이트 조언set -x
글렌 잭맨

당신의 로그 얻을 수있는 set -x것이다 명확 여부를 가까운 터미널 후에는 종료, 또는 어쩌면 수행하여 방법 중 하나를 실행 bash에 의해 출력을 set -x, exec &> exit_log.txt다음 맹목적으로 입력합니다 exit.
Peter Cordes

3

exitbash의 "내장"명령이므로 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을

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.