我有一个用于运行某些程序以从系统收集数据的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
答案 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 ...
)。