2022년 9월 5일에 업데이트됨:

2022년 9월 5일에 업데이트됨:

관련 게시물수년 전에 나는 bash 기록에 저장된 "위험한" 명령을 실수로 실행하지 않도록 주석 처리하는 방법에 대한 해결책을 찾았습니다.

에서 동일한 것을 구현하는 가장 좋은 솔루션은 무엇입니까 zsh?

zsh이 목적으로 사용할 수 있는 기능이 제공 됩니까 ? 제 생각에는 zshbeieng이 더 유연하고 더 쉬울 것 같아요 zsh.

참고로 이것은 내가 사용한 것입니다 bash(Stéphane Chazelas의 답변을 기반으로 함).

fixhist() {
   local cmd time histnum
   cmd=$(HISTTIMEFORMAT='<%s>' history 1)
   histnum=$((${cmd%%[<*]*}))
   time=${cmd%%>*}
   time=${time#*<}
   cmd=${cmd#*>}
   case $cmd in
     (cp\ *|mv\ *|rm\ *|cat\ *\>*|pv\ *|dd\ *)
       history -d "$histnum" # delete
       history -a
       [ -f "$HISTFILE" ] && printf '#%s\n' "$time" " $cmd" >> "$HISTFILE";;
     (*)
       history -a
   esac
   history -c
   history -r
}

2022년 9월 5일에 업데이트됨:

허용되는 솔루션은 효과가 있지만 예상치 못한 부작용이 있습니다. insert-last-word키 바인딩을 엉망으로 만듭니다 . 간단한 설명은 다음과 같습니다.

나는 "위험" 명령 중 하나를 사용합니다.

rm zz

(필요에 따라) 설명과 함께 기록에 추가되었습니다.

history
...
# rm zz

기록에 또 다른 명령을 추가해 보겠습니다.

echo foo

Alt이제 +를 사용하여 기록을 반복하려고 하면 .다음과 같은 결과를 얻습니다.

echo <Alt> + .

foo
history
# rm zz

제안을 받는 대신 zz전체 댓글 순서를 제안받았습니다 # rm zz.

이 문제를 어떻게 해결할 수 있나요?

답변1

물론 zshaddhistory후크 기능을 사용하고 일반 기록 처리를 비활성화하세요.

function zshaddhistory() {
  # defang naughty commands; the entire history entry is in $1
  if [[ $1 =~ "cp\ *|mv\ *|rm\ *|cat\ *\>|pv\ *|dd\ *" ]]; then
    1="# $1"
  fi
  # write to usual history location
  print -sr -- ${1%%$'\n'}
  # do not save the history line. if you have a chain of zshaddhistory
  # hook functions, this may be more complicated to manage, depending
  # on what those other hooks do (man zshall | less -p zshaddhistory)
  return 1
}

zsh 5.0.8에서 테스트됨

% exec zsh
% echo good
good
% echo bad; rm /etc 
bad
rm: /etc: Operation not permitted
% history | tail -4
  299  exec zsh
  300  echo good
  301  # echo bad; rm /etc
  302  history | tail -4
%   

extendedhistory이는 옵션 세트에도 적용되는 것 같습니다.

답변2

다음 기능은 수정된 thrig의 기능을 기반으로 합니다 histignorespace.

function zshaddhistory() {
  if [[ $1 =~ "^ " ]]; then
    return 0
  elif [[ $1 =~ "cp\ *|mv\ *|rm\ *|cat\ *\>|pv\ *|dd\ *" ]]; then
    1="# $1"
  fi
  # write to usual history location
  print -sr -- ${1%%$'\n'}
  # do not save the history line. if you have a chain of zshaddhistory
  # hook functions, this may be more complicated to manage, depending
  # on what those other hooks do (man zshall | less -p zshaddhistory)
  return 1
}

관련 정보