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이는 기록 파일에 추가되지 않고 기록이 표시될 때만 적용되므로 원하는 대로 작동하지 않습니다.)

Bash는 #nnnn각 명령 항목 위에 과거 타임스탬프를 (epoch 초) 줄로 저장합니다. 원칙적으로는 $PWD아무 것도 깨지지 않고 타임스탬프 다음 줄에 추가할 수 있지만 이를 올바르게 지원하려면 몇 가지 중요한 코드 변경이 필요합니다.

관련 정보