zsh 기록에서 마지막 명령 (또는 보너스의 현재 명령)을 제거하는 방법


14

물론이 작업을 수행하는 매우 간단한 똑똑한 방법이 있지만 zshell의 기록이 fc에 별칭으로 표시되어 있기 때문에 기록에서 한 줄을 제거하는 방법에 언급 된 트릭을 사용할 방법이 없습니다 . .

이 작업을 수행하는 방법에 대한 조언이 있습니까? 내 유스 케이스는 기록에서 마지막으로 발행 된 명령을 제거하여 자동 완성을 중지합니다 (대부분 무언가 잘못 입력하고 계속 표시되는 경우).

나는 내가함으로써 마지막으로 발행 된 명령을 얻을 수 있다는 것을 안다

history | tail -n 1하지만 history -d가 작동하지 않아 zsh에 대한 적절한 문서를 찾을 수 없습니다.

답변:


9

Zsh는 실제 히스토리 에디션 기능을 제공하지 않습니다. 명령 기록은 기본적으로 읽기 전용입니다. 당신이 할 수있는 일은 도매로 교체하는 것입니다.

명령 행 히스토리를 편집하려면 다음을 수행하십시오.

  1. 파일로 저장하십시오. fc -W
  2. 파일 편집
  3. 파일에서 히스토리를로드하십시오. fc -R

을 설정하여 파일 이름을 선택할 수 있습니다 HISTFILE.

테스트되지 않은 코드 :

remove_last_history_entry () {
  setopt local_options extended_history no_hist_save_no_dups err_return

  local HISTFILE=~/.zsh_history_tmp_$$ SAVEHIST=$HISTSIZE
  fc -W
  ed -s $HISTFILE <<EOF >/dev/null
d
w
q
EOF
  fc -R
}

6

일반적으로에서 행을 제거 ~/.zsh_history할 수 있지만 찾을 수없는 경우 ~/.zshrc내역 파일의 위치를 ​​찾으십시오.

그런 다음 원하는 텍스트 편집기를 사용하여 문제가되는 행을 제거하십시오. 또는 전체 파일을 삭제하고 모든 zsh 인스턴스를 닫고 새 인스턴스를 시작하십시오. 역사가 지워졌다!


2

그렇습니다. 이것은 오래된 주제이지만이 질문들 중 어느 것도 저에게 대답하지 않았습니다. 그래서 나도 이것을 알아 내려고 노력했습니다.

'fc -R'과 'fc -W'를 사용하는 힌트에 대한 @Gilles의 감사에 대한 내 솔루션은 다음과 같습니다 .

아래 스크립트를 .zshrc 파일에 붙여 넣습니다.

소스 .zshrc로 다시로드

마지막 명령 인 D를 잊어 버리려면 'forget'을 입력하십시오. 마지막 3 개의 명령을 잊어 버리려면 'forget 3'을 입력하십시오. 섹시한 시즈.

위쪽 화살표를 누르면 마지막 명령으로 바로 이동하여 'forget'이라는 단어를 기억하지 않습니다 :).

업데이트 : 홈 경로가 추가되어 이제 모든 디렉토리에서 작동합니다.

업데이트 2 : 잊고 싶은 마지막 명령 수를 전달하는 기능이 추가되었습니다. : D. 마지막 2 개의 명령을 잊어 버리려면 'forget 2'를 시도하십시오 : D.

# Put a space at the start of a command to make sure it doesn't get added to the history.
setopt histignorespace

alias forget=' my_remove_last_history_entry' # Added a space in 'my_remove_last_history_entry' so that zsh forgets the 'forget' command :).

# ZSH's history is different from bash,
# so here's my fucntion to remove
# the last item from history.
my_remove_last_history_entry() {
    # This sub-function checks if the argument passed is a number.
    # Thanks to @yabt on stackoverflow for this :).
    is_int() ( return $(test "$@" -eq "$@" > /dev/null 2>&1); )

    # Set history file's location
    history_file="${HOME}/.zsh_history"
    history_temp_file="${history_file}.tmp"
    line_cout=$(wc -l $history_file)

    # Check if the user passed a number,
    # so we can delete x lines from history.
    lines_to_remove=1
    if [ $# -eq 0 ]; then
        # No arguments supplied, so set to one.
        lines_to_remove=1
    else
        # An argument passed. Check if it's a number.
        if $(is_int "${1}"); then
            lines_to_remove="$1"
        else
            echo "Unknown argument passed. Exiting..."
            return
        fi
    fi

    # Make the number negative, since head -n needs to be negative.
    lines_to_remove="-${lines_to_remove}"

    fc -W # write current shell's history to the history file.

    # Get the files contents minus the last entry(head -n -1 does that)
    #cat $history_file | head -n -1 &> $history_temp_file
    cat $history_file | head -n "${lines_to_remove}" &> $history_temp_file
    mv "$history_temp_file" "$history_file"

    fc -R # read history file.
}

여기 몇 가지 일이 있습니다. 이 명령을 사용하면 명령 앞에 공백을 입력 할 수 있으며 기록에 추가되지 않습니다.

setopt histignorespace

따라서 스페이스 바를 누르고 'echo hi'를 입력하고 Enter 키를 누른 다음 위쪽 화살표를 누르면 'echo hi'가 기록에 없습니다. :).

'forget'이라는 별칭이 my_remove_last_history_entry 앞에 공백이있는 방법에 주목하십시오. 이것은 zsh가 우리의 '잊어 버린'을 역사에 저장하지 않도록하기위한 것입니다.

기능 설명

ZSH는 히스토리 등을 위해 fc를 사용하므로 'fc -W'를 사용하여 현재 명령을 히스토리 파일에 기록하고 'head -n -1'을 사용하여 파일에서 마지막 명령을 자릅니다. 해당 출력을 임시 파일에 저장 한 다음 원래 기록 파일을 임시 파일로 바꿉니다. 마지막으로 fc -R을 사용하여 기록을 다시로드하십시오.

그러나 별명으로 수정 된 기능에 문제점이 있습니다.

함수 이름으로 함수를 실행하면 마지막 명령이 제거되고 함수를 호출합니다. 따라서 공백을 사용하여 별명을 호출하여 별명을 사용하므로 zsh는이 함수 이름을 히스토리 파일에 추가하지 않고 마지막 항목을 원하는 이름으로 만듭니다 .D.


마지막 명령이 여러 줄이면 어떻게됩니까?
avp December

공식 답변으로 투표해야합니다. 감사.
gsl

1

zsh설정된, histignorespace옵션 ( set -o histignorespace). 그리고에 bash추가 ignorespace하거나 ignoreboth(일부 배포판은 이미 기본에 그렇게 ~/.bashrc까지) $HISTCONTROL또는 설정 HISTIGNORE=' *'한 다음은 시작 현재 로모그래퍼 명령을 <공간> 을 기록 피하기 위해.

:
 : none
fc -nl -1

:

에서 zsh이전 명령을 한 번만 기억할 수는 있지만 기록에는 저장되지 않습니다.


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