기록 파일로 내보낼 수 있는 .bash_profile 설정이 있습니다.
export HISTFILE=/root/history/.bash_hist-$(who -m | awk '{print $1}')
그런 다음 기록 명령의 타임스탬프를 내보냅니다.
export HISTTIMEFORMAT="%Y/%m/%d %T "
이 조합으로 인해 에포크 타임스탬프가 기록 파일에 기록됩니다.
#1463962023
top
그래서 .bash_profile에 사람이 읽을 수 있는 타임스탬프만 파일에 기록하는 perl one liner를 작성하여 epoch 줄을 제거했습니다. (및 다른 몇 줄)
format_history () {
local file=/root/history/.bash_hist-$(who -m | awk '{print $1}')
perl -i -pe 's/^#(\d{10})$/"# ".localtime($1)/e' "$file"
}
shopt -s histappend
PROMPT_COMMAND="history -a;format_history;$PROMPT_COMMAND"
이제 내보낸 파일은 다음과 같습니다.
# Sun May 22 19:06:41 2016
last
이것은 훌륭하고 정확히 내가 원했던 것입니다. 그러나 이는 원하지 않는 날짜만 포함하는 기록 명령에 전용 줄을 추가하는 원하지 않는 부작용이 있습니다.
824 2016/05/22 19:07:33 # Sun May 22 19:06:41 2016
825 2016/05/22 19:07:33 last
히스토리 명령이 원치 않는 행을 보고하지 않고 원하는 대로 파일에 쓸 수 있는 방법은 무엇입니까?
참고 - 시스템에 로그인하면 기록 명령의 이러한 변칙성이 "활성화"되는 것 같습니다. (저는 ssh를 사용합니다.) 세션에서 10개의 명령을 실행한 다음 기록 명령을 실행하면 모든 것이 괜찮아 보입니다. 그러나 로그아웃했다가 다시 로그인하여 기록 명령을 실행하면 오류 줄이 표시됩니다.
업데이트: 문제의 범위를 다음 줄로 좁혔습니다.
PROMPT_COMMAND="history -a;format_history;$PROMPT_COMMAND"
이 줄을 주석 처리하면 기록 명령이 예상대로 작동합니다. 그러나 이는 히스토리 파일의 형식을 지정하는 명령이기도 합니다. 줄에서 "history -a" 부분을 제거하고 나머지는 그대로 두려고 했지만 아무런 차이가 없었습니다. 전체 줄을 주석 처리하면 Perl 스크립트를 사용하여 파일 형식을 어떻게 호출할 수 있습니까?
답변1
나는 기록 파일을 유지하고 프롬프트_명령 처리기에서 명령 로깅을 구현합니다. 또한 기록 파일의 다른 사용과 충돌하지 않거나 /root에 액세스하는 다른 사용자와 문제가 발생하지 않도록 개인 로그 파일에 기록할 것입니다.