Bash 기록에 현재 디렉터리를 포함하는 유틸리티나 플러그인이 있습니까?

Bash 기록에 현재 디렉터리를 포함하는 유틸리티나 플러그인이 있습니까?

bash 기록에서 명령이 실행된 작업 디렉터리를 표시하는 것은 매우 유용합니다. 기록을 통해 자신이 무엇을 했는지 알 수 있지만 어디서 무엇을 했는지 알기는 어려울 수 있습니다.

그러한 플러그인이나 유틸리티가 있습니까? 아니면 이를 추가하도록 bash를 구성할 수 있습니까?

답변1

당신은 사용할 수 있습니다PROMPT_COMMAND.profile기능을 / 에 추가하세요 .bashrc.

myprompt() {  
  [[ "$PWD" != "$PREVPWD" ]] && history -s "# cd \"$PWD\""
  PREVPWD="$PWD" 
}  
PROMPT_COMMAND=myprompt

cd이는 현재 디렉토리가 변경될 때마다 기록에 (주석 처리된) 명령을 추가합니다 . 를 저장하므로 $PWD다음과 같은 것은 cd ..여전히 ​​전체 경로를 기록합니다. 이것은 일반 기록에 나타나므로 가장 편리하지 않으며 다음과 같은 약어를 사용하지 않습니다 !$.

여기에 더 나은(과도하게 엔지니어링된) 버전이 있습니다. 이전 명령이 디렉토리를 절대 디렉토리로 변경하여 기록 오염을 방지하는지 확인합니다.

myprompt() {
  local _seq _date _time _cmd _args
  [[ -z "$HISTTIMEFORMAT" ]] && { 
    ## reads history with no HISTTIMEFORMAT set
    read _seq _cmd _args < <(history 1)
  } || {
    ## this reads history with a HISTTIMEFORMAT='%Y%m%d %H:%M:%S '
    read _seq _date _time _cmd _args < <(history 1)
  }
  ## escaping =~ is troublesome, use variables instead
  local _re1='(cd|pushd|popd)'
  local _re2='^"?/'
  ## check for change-of-directory with absolute path
  [[ "$_cmd" =~ $_re1 && "$_args" =~ $_re2 ]] && {
    PREVPWD="$PWD"
    return
  }
  [[ "$PWD" != "$PREVPWD" ]] && {
     history -s "# cd \"$PWD\""    # stuff into history
     PREVPWD="$PWD"
  }
} 
PROMPT_COMMAND=myprompt

사용자 정의가 있는 경우 약간의 조정이 필요할 수 있습니다 HISTTIMEFORMAT.

대신 , , 명령을 history -s삭제하고 다시 삽입/수정하도록 작업을 조정할 수 있습니다 . 예:cdpushdpopd

  [[ "$_cmd" =~ $_re1 ]] && {
    history -d $_seq  # remove original user command
    history -s "$_cmd $_args # $_cmd \"$PWD\"" # add annotated version
  }

HISTTIMEFORMAT(함수 에서 동적으로 변경하는 옵션이 있지만 PROMPT_COMMAND이는 히스토리 파일에 추가되지 않고 히스토리를 표시할 때만 적용되므로 원하는 대로 작동하지 않습니다.)

#nnnnBash는 각 명령 항목 위에 기록 타임스탬프를 (epoch-seconds) 줄로 저장합니다 . 원칙적으로는 $PWD아무 것도 깨지지 않고 타임스탬프 뒤에 해당 줄에 추가할 수 있지만 이를 적절하게 지원하려면 몇 가지 중요한 코드 변경이 필요합니다.

관련 정보