대화형 세션의 하위 셸 내에서 bash 기록 수정

대화형 세션의 하위 셸 내에서 bash 기록 수정

나는 처형했다

history > before; (history -d $n); history > after

$n이 줄을 실행하기 전에 동일한 대화형 세션에서 입력한 마지막 명령에 해당하는 숫자는 어디에 있습니까?

결과적으로 표시된 행이 $n기록에서 제거되지 않습니다. history -d현재 셸에서 실행하기 위해 대괄호를 제거하면 문서에 나온 대로 작동합니다.

이 행동을 이해하는 방법은 무엇입니까? 기록을 조작하기 위한 모든 스크립트를 source작성해야 합니까?

답변1

각 셸 프로세스에는 명령줄 기록에 대한 고유한 아이디어가 있습니다. 대화형 셸이 종료되면 다음 셸이 선택할 수 있도록 기억된 기록을 기록 ~/.bash_history하지만 이것이 셸 프로세스 간의 협력 범위입니다.

명령을 실행하면 쉘이 명령을 ()실행하기 위해 자체 복사본을 분기하게 됩니다 . history -d하위 프로세스는 상위 내부 상태의 복사본으로 시작하므로 이력을 알고 변경할 수 있습니다.그것은그것의 사본.

그러나 서브셸이 종료되면 기록 복사본(다시 작성됨)이 나머지 내부 상태와 함께 삭제됩니다. 서브셸은 자신이 서브셸이라는 것을 알고 있으므로 ~/.bash_history.


소스가 없는 스크립트는 새로운 스크립트로 해석되기 때문에 기록을 전혀 조작할 수 없는 경우가 많습니다.비대화형쉘은 시작시 읽지도 않습니다 ~/.bash_history.

할 수 있는명령줄에 지정하여 셸이 대화형 셸처럼 동작하도록 만듭니다.

#!/bin/bash -i
echo something

이 스크립트를 실행하는 셸은 디스크에서 찾은 명령 에 해당 명령(shebang 줄 sum 포함 echo something) 을 추가합니다. ~/.bash_history그러나 이는 물론 생성한 셸 프로세스의 메모리 기록 복사본에는 영향을 미치지 않습니다.옮기다스크립트가 종료되고 종료되면 스크립트에 의한 변경 사항은 ~/.bash_history어쨌든 손실됩니다.

관련 정보