如果命令完成所需时间超过1分钟,bash将发出嘟嘟声

如果命令完成所需时间超过1分钟,bash将发出嘟嘟声,bash,exec,Bash,Exec,我正在寻找我的bash发出嘟嘟声,如果我执行的命令需要更多的时间 超过一定的墙时间(比如1分钟) 如果它每隔几分钟就响一次直到我按回车键 或者别的什么。。太棒了 有什么好主意吗 我可以使用screen的监视器功能作为最后手段。 (我在cygwin上,但那不重要) 让我澄清一下: $ ls < output appears > $ rsync foo bar < since this takes lot of time, i switch to o

我正在寻找我的bash发出嘟嘟声,如果我执行的命令需要更多的时间 超过一定的墙时间(比如1分钟)

如果它每隔几分钟就响一次直到我按回车键 或者别的什么。。太棒了

有什么好主意吗

我可以使用screen的监视器功能作为最后手段。 (我在cygwin上,但那不重要)

让我澄清一下:

 $ ls    
   < output appears >   
 $ rsync foo bar 
   < since this takes lot of time, i switch to other console
      and forget this .. .and remember only after some time >
    < so when this finished, i want it to beep >
$ls
<输出出现>
$rsync foo bar
<由于这需要很多时间,我切换到其他控制台
忘了这件事。并且只在一段时间后记住>
<所以当这完成时,我希望它发出嘟嘟声>

Linux中有一些命令会为您发出嘟嘟声。查看Ubuntu(可能还有其他发行版)提供的beep源代码,或者查看其他源代码(我相信是相同的代码)

它可以让你轻松地控制频率、长度和重复次数

要让它真正工作,您需要一个脚本,它在后台启动实际的worker程序,然后进入
的“sleep 60”
循环,直到它完成为止

#!/bin/bash
$* &
pid=$!
oldmin=$(date +%M)
exf=$pid
while [[ $exf == $pid ]] ; do
    min=$(date +%M)
    if [[ $oldmin != $min ]] ; then
        beep
        oldmin=$min
    fi
    exf="$(ps -ef | awk '{print $2}' | grep $pid)"
    sleep 2
done
下面的脚本应该是一个好的开始。您可以通过以下方式运行它:

beeper sleep 3600
echo "\007"
它在后台运行
sleep3600
,每分钟都会发出嘟嘟声,直到结束

#!/bin/bash
$* &
pid=$!
oldmin=$(date +%M)
exf=$pid
while [[ $exf == $pid ]] ; do
    min=$(date +%M)
    if [[ $oldmin != $min ]] ; then
        beep
        oldmin=$min
    fi
    exf="$(ps -ef | awk '{print $2}' | grep $pid)"
    sleep 2
done
这就是它的工作原理。它将参数作为后台进程运行,并保存进程ID。然后每隔几秒钟循环一次,检查分钟的变化,并在这种情况下发出嘟嘟声(因此这里的第一声嘟嘟声可能是一分钟以内的任何声音)

当进程从
ps
的输出中消失时,循环退出


你甚至可以使用寻呼机睡眠3600&把所有的东西都放在背景中。要停止嘟嘟声,请关闭嘟嘟声进程(如果您希望在没有嘟嘟声的情况下继续工作)或关闭工作进程本身(这将停止工作和嘟嘟声)。

我不知道它是否在bash上工作,但有许多类似的shell

command && echo ^G

(ctrl-g)将在命令成功完成后发出蜂鸣音。当您希望执行一个长时间运行的命令,然后在另一个窗口中工作,但在第一件事情完成时收到通知时,这通常非常有用。(我不清楚这是否是你的目标。)

我肯定我用过类似于:

beeper sleep 3600
echo "\007"
没有现成的*nix shell可供测试

echo "\007"
  • 给我嘟嘟声

    美元

  • 返回bash中在后台运行的最后一个进程的pid,以便您可以对其进行睡眠并验证它是否仍在运行

更清楚地说,使用$捕获pid!然后无休止地循环睡眠,检查上面的pid是否仍然有效

# bofem [command] [args...] - Beep on Finish every Minute
bofem() {
    "$@"; local r=$?

    until read -t 60 -n 1; do printf '\a'; done
    return $r
}
在(希望)理解了您的需求之后,下面是代码:

#! /bin/bash

if [[ "$#" != "1" ]]
then
  echo "Usage: $0 <command>"
  echo "Will wait till the command finishes and starts beeping once a minute"
  exit 1
fi

CMD="$1"
SECS_BETWEEN_BEEPS="60"

# echo commmand and start time:
echo "@@ Command: '${CMD}'"
echo "@@ Starting at `date`"

# execute and wait till finish:
"${CMD}"
wait

# echo finish time:
echo "@@ Finished at `date`"

# beep once in SECS_BETWEEN_BEEPS:
while ((1))
do
  echo -en '\a'
  sleep "${SECS_BETWEEN_BEEPS}"
done
#/bin/bash
如果[[“$#”!=“1”]]
然后
echo“用法:$0”
echo“将等待命令完成并开始每分钟发出一次蜂鸣声”
出口1
fi
CMD=“$1”
_beep=“60”之间的秒数
#回显命令和开始时间:
echo“@@Command:'${CMD}”
echo“@@1从'date'开始”
#执行并等待完成:
“${CMD}”
等待
#回显完成时间:
echo“@@1在'date'完成”
#在两次嘟嘟声之间以秒为单位嘟嘟一声:
而((1))
做
echo-en'\a'
睡眠“${SECS\u_beep}”
完成

你问的是两个完全不同的问题。首先,您询问如何在一分钟后获取蜂鸣音,然后在命令完成后请求获取蜂鸣音。这是两件完全不同的事情

# bof [command] [args...] - Beep on Finish
bof() {
    "$@"; local r=$?

    printf '\a'
    return $r
}
此函数运行一个命令,然后在命令完成后发出一声蜂鸣音,同时确保命令的退出代码是函数的退出代码

# bot [command] [args...] - Beep on Timeout
bot() {
    { sleep 60; printf '\a'; } &

    "$@"; local r=$?

    kill $!
    return $r
}
除非命令在此时间之前完成(此处,
60
秒,一分钟),否则此功能在特定时间后会发出一次蜂鸣音

这是对早期函数的一个简单修改,只要您的命令仍然有效,它就会每分钟发出嘟嘟声

# bofem [command] [args...] - Beep on Finish every Minute
bofem() {
    "$@"; local r=$?

    until read -t 60 -n 1; do printf '\a'; done
    return $r
}
最后是一个函数,它每分钟发出嘟嘟声,但只有在命令完成后才会发出嘟嘟声。一直发出嘟嘟声,直到你按了一个键停止。然后,函数返回命令的退出代码

我认为这将涵盖你的问题可能涉及的所有基础

这样使用(并组合)它们:

bof rsync foo bar:      # Beep when rsync finishes.
bot ssh foo 'ls bar/'   # Beep if the 'ssh' process takes too long to run.

我喜欢帕克斯提供的答案。看看“嘟嘟”能做什么:

root@tower:/usr/src/linux # beep --help
用法:嘟嘟声[-f频率][-l长度][-r 重复][d延迟][d延迟][s][c] [-e设备]

嘟嘟声[选项…][-n][--新建] [选项…]。。。嘟嘟声[-h][--help] 嘟嘟声[-v][-v][-版本]

因此,当程序继续运行的时间比预期的长时,您可以振荡蜂鸣音(使其更响亮、更长或两者兼而有之)


如果你努力的话,你可以让脚本播放大家最喜欢的80年代流行歌曲的MUSAC版本,这肯定会吸引一些人到终端,如果没有其他原因,只能让它停止。

一个谦虚的建议:如果你有一个你知道需要一段时间的命令,只需在命令后面加一个分号,然后发出嘟嘟声

rsync foo bar; beep

1. <代码>$*?单词拆分和路径名扩展会吃掉你的孩子。2.
ps
检查PID是否仍然有效?诺诺诺,伙计们,请阅读关于kill-0的文章。3.复杂得多?这就是为什么我说脚本是一个开始(我也没有添加其他功能,例如帮助消息或错误检查命令是否启动)。ps运行良好,因此无需更改它,尽管有其他可用功能(我承认我不知道'kill-0',这很好)。我希望提供的脚本是您所需要的