.bash_logout이 명령을 실행하지 않는 이유를 설명하십시오.


11

그래서 터미널의 열린 인스턴스를 닫을 때 마다이 두 줄의 코드를 실행하는 방법이 궁금합니다.

history -c
cat /dev/null > ~/.bash_history

나는 export HISTFILE=5시작하지만 여전히 완료되면 그것을 씻어 내고 싶다.

나는 해봤 조금 둘러보고 A의 장소의 몇 가지 , 그리고 많은 행운이 없었어요 .

Linux Mint를 실행하고 여기에서도 비슷한 문제가 발생했습니다 .bash_profile. 결국 모든 시작 코드를에 배치해야한다는 것을 알았 .bashrc으므로 아마도 관련이있을 수 있습니다. 내 .bash_logout파일은 다음과 같습니다 .

#!/bin/bash
# ~/.bash_logout: executed by bash(1) when login shell exits.

#this does nothing on exit...
echo 'logout'; sleep 2s

# when leaving the console clear the screen to increase privacy

if [ "$SHLVL" = 1 ]; then
    history -c
    cat /dev/null > ~/.bash_history
    [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
fi

이 스크립트를 여러 가지 방법으로 다시 정렬하려고 시도했지만 bash가 어떻게 작동하는지 이해하지 못하는지 확실하지 않으며 처음부터 실행되고 있는지 확실하지 않습니다. 내가 Xserverbash를 실행한다는 사실이 종료시 로그 아웃이 아닌 것을 터미널로 간주 합니까?

내가 로그인 하지 않았다고 말하면 의미가 있습니다.

$> shopt login_shell
login_shell     off

일반적으로 쉘 구성 스크립트가 실행 중인지 여부를 테스트하는 경우 echo명령 echo실행을 방해 할 수있는 다른 작업을 수행하기 전에 시작 하는 것이 좋습니다 . 오류로 인해 스크립트가 종료되기 전에 종료 될 수 있습니다.
Chris 페이지

나는 당신이 이것을 표현 한 방식과 SHLVL = 1을 확인하고 있다는 사실을 이미 가정했습니다. 로그인 쉘인지 이미 확인했습니다. 그렇습니까? 무엇합니까 shopt login_shell말은?
Chris 페이지

답변:


25

로그인 쉘 ( shopt login_shell) 임을 확인했다고 가정합니다 .

~ / .bash_logout은 exit또는로 셸을 명시 적으로 종료 logout하거나 Control-D를 입력하여 명령 프롬프트에 파일 끝을 입력하여 실행하는 경우에만 실행됩니다 . 터미널 에뮬레이터를 닫으면 프로세스에 SIGHUP이 전송되고이 경우 bash는 ~ / .bash_logout을 실행하지 않습니다.

bash가 종료 될 때마다 (그리고 로그인 쉘인지 아닌지) 작업을 수행하려면을 사용하십시오 trap foo EXIT. 가장 편리한 방법은 다음과 같이 쉘 함수에 코드를 넣는 것입니다.

print_goodbye () { echo Goodbye; }
trap print_goodbye EXIT

1
나는 내 나쁜 질문에 완전히 좋은 문제를 낭비하는 것처럼 느낍니다. 첫 문장 을 지나도 여전히 문제가 있는지 다시 물어볼 것 입니다. esh.
Droogans

6

~/.bash_logout만에 의해 실행되는 로그인 (예 : 당신이 나에 TTY 세션에서 얻을 것과 같은 쉘 bash -l). 대부분의 터미널이 실행되는 비 로그인 셸에서는 무시됩니다.

자세한 내용은 "INVOCATION"의 bash (1) 매뉴얼 페이지를 참조하십시오.


영구 히스토리를 유지하지 않으려면 설정을 해제 HISTFILE하거나 설정하십시오 HISTFILE=/dev/null. 이것은 종료시 히스토리를 자동으로 버리고 현재 쉘 ( HISTSIZE=100)에 대해 계속 유지되도록합니다 .

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