이것은 내 기록 파일입니다.
$ echo $HISTFILE
/home/Steven/.bash_history
종료를 사용하여 생성할 수 있습니다.
$ [ -e $HISTFILE ]; echo $?
1
$ exit
$ [ -e $HISTFILE ]; echo $?
0
그러나 서브셸을 종료하면 생성되지 않습니다.
$ [ -e $HISTFILE ]; echo $?
1
$ (exit)
$ [ -e $HISTFILE ]; echo $?
1
서브쉘에 히스토리 파일이 생성되지 않는 이유는 무엇입니까?
답변1
Bash 쉘을 열면 기록 파일의 내용이 전달됩니다. 종료되면 기록 파일에 기록이 추가됩니다.
동일한 터미널 창에서 다른 (대화형) bash 쉘을 열고 일부 명령을 실행하거나 명령만 실행하면 exit
해당 명령(또는 명령만 exit
)이 기록 파일에 추가됩니다.
그러나 비대화형 서브셸을 실행하면 기록이 꺼지고 환경 변수가 HISTFILE
설정 해제됩니다.
또는 를 실행하여 (bash -c 'echo x$HISTFILE')
이를 확인할 수 있습니다 bash -c 'echo x$HISTFILE'
. 이는 echo 만 수행하여 x
변수가 HISTFILE
하위 쉘에 설정되지 않았음을 증명합니다. (방금 x
echo 명령에서 눈에 보이는 출력을 추가했습니다 .)
bash -c
( 작은따옴표를 사용하는 이유 는 상위 쉘에서 쉘 변수 확장을 방지하기 위한 것입니다. run 이면 (echo x$HISTFILE)
쉘 변수 확장은 값을 HISTFILE
서브쉘로 전달한 다음 다시 에코되어 서브쉘에 있었던 것처럼 보이게 합니다.)
따라서 서브쉘이 실행되면 히스토리가 꺼지고 변수가 HISTFILE
설정 해제됩니다. 서브쉘이 종료되면 기록에 아무것도 추가되지 않습니다. 이것이 바로 당신이 보는 것입니다.
서브쉘이 히스토리 파일에 히스토리를 쓰도록 강제할 수 있습니다:
$ history -w # write current history
$ wc -l $HISTFILE # count lines in history file
32 /home/anyuser/.bash_history
$ bash -c 'export HISTFILE=~/.bash_history'
$ wc -l $HISTFILE
32 /home/anyuser/.bash_history
$ bash -c 'export HISTFILE=~/.bash_history;history -w'
$ wc -l $HISTFILE
0 /home/anyuser/.bash_history
마지막 하위 쉘 명령( 사용 history -w
)은 기존 내역 파일을 하위 쉘의 내역으로 덮어씁니다. 이는 비대화형 하위 쉘에서 내역이 꺼져 있기 때문에 비어 있습니다.