4

我想在命令完成后播放声音,但前提是命令花费超过一秒钟。

我有这段代码(从https://stackoverflow.com/a/11056286/1757964复制并稍作修改):

( $COMMAND ) & PID=$!
( sleep 1; wait -f $PID 2>/dev/null; paplay "$SOUND" ) 2>/dev/null & WATCH=$!
wait -f $PID 2>/dev/null && pkill -HUP -P $WATCH

不过,第二行的“等待”似乎立即终止。我尝试了 -f 标志,但行为没有改变。我怎样才能让“等待”真正等待?

4

2 回答 2

3

问题是您wait在子shell 中运行。shell 只能等待它自己的子shell,但您尝试等待的进程是子shell 的兄弟,而不是子shell。

没有必要为此使用wait。您从中复制代码的问题是如果进程花费超过 N 秒,则终止进程,而不是告诉命令花费了多长时间。

您可以使用该SECONDS变量来判断它是否花费了超过一秒钟。此变量包含自 shell 启动以来的秒数,因此只需检查它是否增加。

start=$SECONDS
$COMMAND
if (($SECONDS > $start))
then
    paplay "$SOUND"
fi
于 2020-06-18T22:17:39.507 回答
2

我可能想简化它以捕获数据(自纪元以来的秒数),然后比较差异(如果 > 1 秒则播放声音),例如:

prgstart=$(date '+%s')    # grab current time in terms of # of seconds since epoch

$COMMAND                  # run command in foreground => no need for sleep/wait/etc; once it completes ...

prgend=$(date '+$s')      # grab current time in terms of # of seconds since epoch

if [[ $(( ${prgend} - ${prgstart} )) -gt 1 ]]
then
    paplay "$SOUND"
fi
于 2020-06-18T22:18:41.127 回答