실수로 파일을 셸에 붙여넣으면 bash 기록에 보기 흉하고 의미 없는 항목이 잔뜩 남게 됩니다. 이러한 항목을 제거하는 깔끔한 방법이 있습니까? 분명히 쉘을 닫고 .bash_history
파일을 수동으로 편집할 수 있지만 현재 쉘의 기록을 수정하는 데 사용할 수 있는 일종의 API가 있을까요?
답변1
명령 프롬프트의 이 줄이 도움이 될 것입니다.
for i in {1..N}; do history -d START_NUM; done
여기서 START_NUM은 기록 항목의 시작 위치입니다. N은 삭제하려는 항목 수입니다.
전임자:for i in {1..50}; do history -d 1030; done
답변2
이제부터 명령 bash-5.0-alpha
은 history
delete() 옵션의 범위를 사용합니다 -d
. 바라보다Rasta 파일 답변.
이전 버전의 경우 해결 방법은 다음과 같습니다.
당신은 그것을 사용할 수 있습니다history -d offset
내장 명령은 현재 셸 기록에서 특정 줄을 제거하거나 history -c
전체 기록을 지웁니다.
행 범위를 삭제하려는 경우 오프셋만 인수로 사용하므로 실용적이지 않지만 루프를 사용하여 함수로 래핑할 수 있습니다.
rmhist() {
start=$1
end=$2
count=$(( end - start ))
while [ $count -ge 0 ] ; do
history -d $start
((count--))
done
}
이라고 부르곤 했어요 rmhist first_line_to_delete last_line_to_delete
. (출력된 라인 번호를 기준으로 합니다 history
.)
( history -w
히스토리 파일을 강제로 쓰기 위해 사용됩니다.)
답변3
~에 따르면매뉴얼 페이지스매시 5.x, history
내장 명령도 이제 범위를 사용합니다.
-d offset
이 위치의 기록 삭제
offset
. 만약에offset
음수이면 마지막 과거 위치보다 큰 인덱스 1을 기준으로 해석되므로 음수 인덱스는 기록 끝에서 카운트다운되고 인덱스 -1은 현재를 나타냅니다.history -d
주문하다.
-d start-end
직위 간 기록 삭제
start
그리고end
, 포함됩니다. 양수 및 음수 값start
그리고end
설명은 위와 같습니다.
그러나 history --help
현재(v5.2.21 기준) 이는 반영되지 않습니다.
Options:
-c clear the history list by deleting all of the entries
-d offset delete the history entry at position OFFSET. Negative
offsets count back from the end of the history list
-a append history lines from this session to the history file
...
예를 들어 history -d 2031-2034
한 번에 4개의 행을 삭제합니다. 다음을 사용하여 $HISTCMD
최신 행부터 삭제할 수 있습니다 .질소뒤로 줄을 긋습니다.
내보내기를 사용한 history -w tmpfile
다음 파일을 편집하고, 지우기를 사용한 history -c
다음 다시 읽기를 사용할 수도 있습니다 history -r tmpfile
. (직접) 편지를 쓸 필요가 없습니다 .bash_history
.
답변4
arg는 history -d
범위를 허용하며 $HISTCMD
역사상 가장 큰 숫자입니다.
이 함수는 기록에서 마지막 항목을 제거하는 데 사용됩니다 n
(제거할 기록 명령 수를 전달하면 됩니다. 예 rmhist 5
:
$ rmhist() { history -d $(($HISTCMD - $1))-$HISTCMD ;}
또는..이력(포함) 또는 마지막 'n' 명령에서 삭제하려면 다음과 같은 인수를 사용하십시오.
rmhist() {
case $1 in
--from|from) local start=$2; ;;
--last|last) local start=$(($HISTCMD - $2)) ;;
*) echo "Try rmhist --from # or rmhist --last n "; return ;;
esac;
history -d ${start}-${HISTCMD}
}
결과는 다음과 같습니다.
5778 ls /etc
5779 ls /tmp
5780 ls /dev
5781 ll
5782 cd /tmp
5783 cd
5784 history
(base) ~ $ rmhist --last 3
(base) ~ $ history 5
5778 ls /etc
5779 ls /tmp
5780 ls /dev
5781 ll
5782 history 5
(base) ~ $ rmhist --from 5780
(base) ~ $ history 5
5776 history 10
5777 ls
5778 ls /etc
5779 ls /tmp
5780 history 5