diff --git a/lib/command_duration.bash b/lib/command_duration.bash index cd1d6636db..ec4d828d0c 100644 --- a/lib/command_duration.bash +++ b/lib/command_duration.bash @@ -2,12 +2,24 @@ # # Functions for measuring and reporting how long a command takes to run. -: "${COMMAND_DURATION_START_SECONDS:=${EPOCHREALTIME:-$SECONDS}}" +# Get shell duration in decimal format regardless of runtime locale. +# Notice: This function runs as a sub-shell - notice '(' vs '{'. +function _shell_duration_en() ( + # DFARREL You would think LC_NUMERIC would do it, but not working in my local + LC_ALL='en_US.UTF-8' + printf "%s" "${EPOCHREALTIME:-$SECONDS}" +) + +: "${COMMAND_DURATION_START_SECONDS:=$(_shell_duration_en)}" : "${COMMAND_DURATION_ICON:=🕘}" : "${COMMAND_DURATION_MIN_SECONDS:=1}" function _command_duration_pre_exec() { - COMMAND_DURATION_START_SECONDS="${EPOCHREALTIME:-$SECONDS}" + COMMAND_DURATION_START_SECONDS="$(_shell_duration_en)" +} + +function _command_duration_pre_cmd() { + COMMAND_DURATION_START_SECONDS="" } function _dynamic_clock_icon { @@ -20,13 +32,15 @@ function _dynamic_clock_icon { function _command_duration() { [[ -n "${BASH_IT_COMMAND_DURATION:-}" ]] || return + [[ -n "${COMMAND_DURATION_START_SECONDS:-}" ]] || return local command_duration=0 command_start="${COMMAND_DURATION_START_SECONDS:-0}" local -i minutes=0 seconds=0 deciseconds=0 local -i command_start_seconds="${command_start%.*}" local -i command_start_deciseconds=$((10#${command_start##*.})) command_start_deciseconds="${command_start_deciseconds:0:1}" - local current_time="${EPOCHREALTIME:-$SECONDS}" + local current_time + current_time="$(_shell_duration_en)" local -i current_time_seconds="${current_time%.*}" local -i current_time_deciseconds="$((10#${current_time##*.}))" current_time_deciseconds="${current_time_deciseconds:0:1}" @@ -59,3 +73,4 @@ function _command_duration() { } _bash_it_library_finalize_hook+=("safe_append_preexec '_command_duration_pre_exec'") +_bash_it_library_finalize_hook+=("safe_append_prompt_command '_command_duration_pre_cmd'") diff --git a/plugins/available/cmd-returned-notify.plugin.bash b/plugins/available/cmd-returned-notify.plugin.bash index 88c07722df..e6d221faac 100644 --- a/plugins/available/cmd-returned-notify.plugin.bash +++ b/plugins/available/cmd-returned-notify.plugin.bash @@ -4,7 +4,8 @@ about-plugin 'Alert (BEL) when process ends after a threshold of seconds' function precmd_return_notification() { local command_start="${COMMAND_DURATION_START_SECONDS:=0}" - local current_time="${EPOCHREALTIME:-$SECONDS}" + local current_time + current_time="$(_shell_duration_en)" local -i command_duration="$((${current_time%.*} - ${command_start%.*}))" if [[ "${command_duration}" -gt "${NOTIFY_IF_COMMAND_RETURNS_AFTER:-5}" ]]; then printf '\a' diff --git a/test/plugins/cmd-returned-notify.plugin.bats b/test/plugins/cmd-returned-notify.plugin.bats index 04edad9582..a5ae591a51 100644 --- a/test/plugins/cmd-returned-notify.plugin.bats +++ b/test/plugins/cmd-returned-notify.plugin.bats @@ -9,7 +9,7 @@ function local_setup_file() { @test "plugins cmd-returned-notify: notify after elapsed time" { export NOTIFY_IF_COMMAND_RETURNS_AFTER=0 - export COMMAND_DURATION_START_SECONDS="${EPOCHREALTIME:-$SECONDS}" + export COMMAND_DURATION_START_SECONDS="$(_shell_duration_en)" sleep 1 run precmd_return_notification assert_success @@ -18,7 +18,7 @@ function local_setup_file() { @test "plugins cmd-returned-notify: do not notify before elapsed time" { export NOTIFY_IF_COMMAND_RETURNS_AFTER=10 - export COMMAND_DURATION_START_SECONDS="${EPOCHREALTIME:-$SECONDS}" + export COMMAND_DURATION_START_SECONDS="$(_shell_duration_en)" sleep 1 run precmd_return_notification assert_success @@ -34,7 +34,7 @@ function local_setup_file() { @test "lib command_duration: preexec set COMMAND_DURATION_START_SECONDS" { export COMMAND_DURATION_START_SECONDS= assert_equal "${COMMAND_DURATION_START_SECONDS}" "" - NOW="${EPOCHREALTIME:-$SECONDS}" + NOW="$(_shell_duration_en)" _command_duration_pre_exec # We need to make sure to account for nanoseconds... assert_equal "${COMMAND_DURATION_START_SECONDS%.*}" "${NOW%.*}"