Bash等待立即终止?

Bash wait terminates immediately?

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

我有这段代码(从复制并稍作修改):

( $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

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

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

不需要为此使用 wait。你从中复制代码的问题是如果一个进程花费的时间超过 N 秒就终止它,而不是告诉一个命令花费了多长时间。

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

start=$SECONDS
$COMMAND
if (($SECONDS > $start))
then
    paplay "$SOUND"
fi

我可能想简化它以捕获数据(自纪元以来的秒数)然后比较差异(如果 > 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