在bash中使用watch主动显示已用时间

时间:2014-07-17 18:50:20

标签: bash

我有一个用于运行某些程序以从系统收集数据的bash脚本,并且在脚本的末尾是一个以1s的刷新率显示输出文件大小的监视器。 我试图让它显示脚本运行了多长时间,使用$ SECONDS,但似乎将$ SECONDS放入监视状态时会从手表开始时读取$ SECONDS。

有更好的方法可以做到这一点,还是让$ SECONDS在这种情况下工作?

相关的代码部分,试图概括它:

convertsecs() { #Function used to convert seconds into HH:MM:SS
    ((h=${1}/3600))
    ((m=(${1}%3600)/60))
    ((s=${1}%60))
    printf "%02d:%02d:%02d\n" $h $m $s
}

SECONDS=0 #Start counting from this point
watch -n 1 "<pipeline stuff> | awk '{print \"some stuff here\",\"Time elapsed: \",\"$(convertsecs $SECONDS)\"}'"

编辑: 我确实确认问题是手表将$ SECONDS作为其值,然后在手表持续时间内保持该值,所以此时的问题是更好的方法,或者一种有效的方法 我的意思是: SECONDS=0 watch -n 1 "echo $SECONDS" 结果是 Every 1.0s: echo 0 0

1 个答案:

答案 0 :(得分:1)

这是一个基本的脚本做你想要的,我猜:

#!/bin/bash

convertsecs() { #Function used to convert seconds into HH:MM:SS
    ((h=${1}/3600))
    ((m=(${1}%3600)/60))
    ((s=${1}%60))
    printf "%02d:%02d:%02d\n" $h $m $s
}
typeset -fx convertsecs # export to sub-shells
                        # maybe this is implicit with your version of Bash

NOW=$(exec date +%s)

cmd() {
    echo it"'"s fact of life than shell   # Replace by *your*
    echo quoting can be a '"nightmare"'   # actual commands
}
typeset -fx cmd

watch -n 1 \
    'bash -c '"'"'cat <(cmd) \
                      <(echo Elapsed $(convertsecs $(($(exec date +%s) - '$NOW'))))'"'"

关键问题是正确引用传递给watch的命令。此外,我已导出函数 convertsecs,因此它可用于子shell。

注意我如何包装&#34;用户命令&#34;在一个功能。这样,当我作为参数传递给watch时,我不必担心这些命令的正确引用。

此外,我在这里使用cat进行流程替换以附加行&#34; Elapsed ...&#34;在我的主命令输出之后。我做出了这个选择,以明确区分有用的东西&#34; (cmd)来自&#34;化妆品和#34; (Elapsed ...)。