스크립트에서 대화형 쉘 히스토리 확장 사용

스크립트에서 대화형 쉘 히스토리 확장 사용

다음 Bash 스크립트가 있습니다

set -o histexpand
set -o history
pwd
lc="!!"

대화형 쉘에서 실행하면 인쇄됩니다.

/home/user
lc="pwd"

lc=pwd.을 가져오는 대신 기록 확장을 사용하여 대화형 셸에서 사용되는 마지막 명령을 가져오고 싶습니다 . 따라서 내가 실행하면 echo foo; ./script다음을 얻을 것으로 예상됩니다.

/home/user
lc="echo foo"

스크립트에서 시도했지만 set -H성공하지 못했습니다.

답변1

스크립트를 실행하기 전에 쉘 세션에서 실행된 명령을 가져오기 위해 쉘의 히스토리 확장을 사용하는 것은 불가능합니다. 단, 호출하는 쉘이 $HISTFILE각 실행된 명령 후에 히스토리를 저장하고( bash기본적으로는 수행하지 않음) HISTFILE변수를 내보내지 않는 한 불가능합니다. 그것을 할 필요가 있습니다.

기본적으로 bash셸은 현재 대화형 셸 세션의 메모리 내 기록을 유지합니다. 이 기록은 $HISTFILE셸 세션이 종료될 때 저장됩니다. 명령줄 기록이 활성화된 새 세션이 시작되면 이 파일에서 저장된 기록을 읽습니다(새 셸이 동일한 $HISTFILE값을 사용한다고 가정).

호출 환경에서 상속된 변수가 없는 한 스크립트는 HISTFILE자체 세션의 명령줄 기록, 즉 스크립트 내의 명령에만 액세스할 수 있습니다. 내보냈 지만 HISTFILE호출 셸이 $HISTFILE스크립트를 실행하기 전에 기록을 저장하지 않은 경우 해당 상위 셸 세션의 메모리 내 기록을 얻을 수 없으며 액세스할 수 있는 최선의 방법은 세션이 죽은 지 오래되었다는 것입니다.

관련 정보