10

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

如果它每隔几分钟就一直发出哔哔声,直到我按下回车键或其他东西.. 那太好了。

有什么聪明的主意吗?

我可以使用屏幕的监控功能作为最后的手段。(我在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 >
4

7 回答 7

4

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

rsync foo bar; beep
于 2011-11-20T00:16:36.253 回答
2

Linux 中有一些命令会为您发出哔哔声。查看 Ubuntu(可能还有其他发行版)提供的 beep 源代码,或者查看http://www.johnath.com/beep/beep.c以获取另一个源代码(我相信它是相同的代码)。

它允许您轻松控制频率、长度和重复次数(除其他外)。

要真正让它工作,你需要一个脚本在后台启动你的实际工作程序,然后进入一个"sleep 60"循环,发出哔哔声直到它完成。

以下脚本应该是一个好的开始。您可以使用以下方式运行它:

beeper sleep 3600

sleep 3600在后台运行,每分钟发出哔哔声,直到完成。

#!/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

你甚至可以做beeper sleep 3600 & 把整个地段放在后台。要停止蜂鸣声,请关闭蜂鸣器进程(如果您希望在没有蜂鸣声的情况下继续工作)或杀死工作进程本身(这将停止工作和蜂鸣声)。

于 2009-04-13T07:02:16.487 回答
0

我确定我使用过类似的东西:

echo "\007"

没有方便测试的 *nix shell。

于 2009-04-13T07:10:15.517 回答
0
echo "\007"
  • 为我发出哔哔声。

    美元!

  • 返回在 bash 中在后台运行的最后一个进程的 pid,因此您可以在其上休眠并验证它是否仍在运行。

为了更清楚,使用 $! 捕获 pid!并在无限循环中休眠并检查上面的pid是否还活着。

在(希望)理解你想要什么之后,这里是代码:

#! /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
于 2009-04-13T07:12:51.783 回答
0

我喜欢 Pax 提供的答案。看看“哔”能做什么:

root@tower:/usr/src/linux # beep --help

用法:哔声 [-f 频率] [-l 长度] [-r reps] [-d 延迟] [-D 延迟] [-s] [-c] [-e 设备]

哔声 [选项...] [-n] [--new] [选项...] ...哔声 [-h] [--help] 哔声 [-v] [-V] [--version]

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

如果您使用它,您可以让脚本播放每个人最喜欢的 80 年代热门歌曲的 MUSAC 版本,这肯定会吸引某人到终端,如果没有其他原因只是让它停止。

于 2009-04-14T08:43:37.530 回答
-1

我不知道它是否适用于 bash,但是对于许多 shell,例如

command && echo ^G

(ctrl-g) 成功完成命令后会发出哔哔声。当您想要执行一个长时间运行的命令然后在另一个窗口中工作但在第一件事完成时收到通知时,这通常很有用。(我不清楚这是否是你的目标。)

于 2009-04-13T07:03:19.713 回答
-2

你在这里问两个完全不同的事情。首先,您询问如何在一分钟后发出哔声,然后您要求在命令完成后发出哔声。这是两件完全不同的事情。

# 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除非命令在该时间之前完成(此处为秒,一分钟),否则此功能会在特定时间后发出一次哔声。

# bem [command] [args...] - Beep every Minute
bem() {
    { while sleep 60; do printf '\a'; done; } &

    "$@"; local r=$?

    kill $!
    return $r
}

这是对早期功能的简单改编,只要您的命令仍然存在,它就会每分钟发出哔声。

# 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.
于 2009-04-13T08:18:27.787 回答