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
이는 기록 파일에 추가되지 않고 기록이 표시될 때만 적용되므로 원하는 대로 작동하지 않습니다.)
Bash는 #nnnn
각 명령 항목 위에 과거 타임스탬프를 (epoch 초) 줄로 저장합니다. 원칙적으로는 $PWD
아무 것도 깨지지 않고 타임스탬프 다음 줄에 추가할 수 있지만 이를 올바르게 지원하려면 몇 가지 중요한 코드 변경이 필요합니다.