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
我想在命令完成后播放声音,但前提是命令超过一秒。
我有这段代码(从复制并稍作修改):
( $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