【问题标题】:Bash wait terminates immediately?Bash 等待立即终止?
【发布时间】:2020-06-18 21:41:08
【问题描述】:

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

我有这段代码(从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 标志,但行为没有改变。我怎样才能让“等待”真正等待?

【问题讨论】:

    标签: bash job-control


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-02
        • 1970-01-01
        • 2023-01-04
        • 2020-04-21
        • 2015-04-22
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        相关资源
        最近更新 更多