마지막 명령의 정지 시간을 계산하려면 다음 코드( code #1
)를 사용합니다.
#
# Taken from https://stackoverflow.com/a/34812608/9881330
# Slightly modified.
#
function timer_now {
date +%s%N
}
function timer_start {
timer_start=${timer_start:-$(timer_now)}
}
function timer_stop {
local delta_us=$((($(timer_now) - $timer_start) / 1000))
local us=$((delta_us % 1000))
local ms=$(((delta_us / 1000) % 1000))
local s=$(((delta_us / 1000000) % 60))
local m=$(((delta_us / 60000000) % 60))
local h=$((delta_us / 3600000000))
# Goal: always show around 3 digits of accuracy
if ((h > 0)); then timer_show=${h}h${m}m
elif ((m > 0)); then timer_show=${m}m${s}s
elif ((s >= 10)); then timer_show=${s}.$((ms / 100))s
elif ((s > 0)); then timer_show=${s}.$(printf %03d $ms)s
elif ((ms >= 100)); then timer_show=${ms}ms
elif ((ms > 0)); then timer_show=${ms}.$((us / 100))ms
else timer_show=${us}us
fi
unset timer_start
}
set_prompt () {
PS1="\n\$?"
timer_stop
PS1+=" / $timer_show"
PS1+="\n\n\[\e]0;\w\a\]\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\$ "
}
trap 'timer_start' DEBUG
PROMPT_COMMAND='set_prompt'
그리고 그것은 매우 잘 작동합니다:
$ gcc
gcc: fatal error: no input files
compilation terminated.
1 / 108ms
$ date
Sun Dec 27 14:53:10 RTZST 2020
0 / 89.3ms
그러나 이 history is lost after ssh connection is reset by peer
문제를 해결하려면 (Bash: 피어가 SSH 연결을 재설정한 후 기록이 손실되었습니다. 기록을 저장하는 방법은 무엇입니까?), 이전 코드( code #1
) 뒤에 이 코드( )를 추가했습니다 code #2
.
PROMPT_COMMAND="${PROMPT_COMMAND:+${PROMPT_COMMAND/%;};}history -a"
이제 마지막 명령의 정지 시간이 잘못 계산됩니다(명령은 시각적으로 평소와 같이 밀리초 단위로 실행됩니다).
$ gcc
gcc: fatal error: no input files
compilation terminated.
1 / 1.990s
$ date
Sun Dec 27 14:56:07 RTZST 2020
0 / 3.586s
질문: code #2
뒤에 추가하면 잘못된 결과가 나타나는 이유는 무엇 code #1
입니까 ? code #1
어떻게 고치나요?
답변1
일련의 사건(독자가 무엇이 ${var:-someval}
효과가 있는지 안다고 가정):
- 몇 가지 명령을 입력합니다.
- Enter 키를 누르면
DEBUG
트랩이 실행됩니다.timer_start=${timer_start:-$(timer_now)}
- 그런 다음 명령을 실행하십시오.
- 그런 다음
set_prompt
실행되었습니다.- 바라바라 그럼
unset timer_start
- 타이머가 다시 시작됩니다.
- 그런 다음
DEBUG
이전에 트랩을 실행하십시오.history -a
timer_start=${timer_start:-$(timer_now)}
- 그런 다음
history -a
실행되었습니다. - 시간이 흐르고 명령을 입력합니다.
- 그러면
DEBUG
명령을 입력하기 전에 트랩이 실행됩니다.timer_start=${timer_start:-$(timer_now)}
- 하지만
timer_start
이미 설정되어 있어서 아무 일도 일어나지 않습니다.
- 그러면 명령이 실행됩니다.
set_prompt
마지막prompt_command
실행 이후의 시간을 측정하기 때문에 매우 깁니다history -a
.
history -a
예를 들어 실행 전에 실행하거나 set_prompt
런타임 시 트랩을 제거합니다.DEBUG