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
삭제하고 다시 삽입/수정하도록 작업을 조정할 수 있습니다 . 예:cd
pushd
popd
[[ "$_cmd" =~ $_re1 ]] && {
history -d $_seq # remove original user command
history -s "$_cmd $_args # $_cmd \"$PWD\"" # add annotated version
}
HISTTIMEFORMAT
(함수 에서 동적으로 변경하는 옵션이 있지만 PROMPT_COMMAND
이는 히스토리 파일에 추가되지 않고 히스토리를 표시할 때만 적용되므로 원하는 대로 작동하지 않습니다.)
#nnnn
Bash는 각 명령 항목 위에 기록 타임스탬프를 (epoch-seconds) 줄로 저장합니다 . 원칙적으로는 $PWD
아무 것도 깨지지 않고 타임스탬프 뒤에 해당 줄에 추가할 수 있지만 이를 적절하게 지원하려면 몇 가지 중요한 코드 변경이 필요합니다.