我的命令完成后如何获得通知


64

我正在命令行上运行一系列命令,大约需要20分钟才能完成。我想在Mac上看到完成后的某种通知,因此不需要监视终端的完成时间。有没有办法做到这一点?

$ svn update . && ant clean build start && *notify_me_somehow*

编辑

我可以使用,xclock但这似乎是一个hack。理想情况下,我可以将通知发送到任何地方,例如手机,屏幕等。


2
尽管您在命令行中,但我认为这里的答案实际上是Mac特定的,而与Unix / Linux不相关。那是因为我认为您可能想使用Growl和grownlnotify

那不是内置命令,至少在我的盒子上是这样。

growl.info Growl是@mattdm引用的程序。
jsbillings 2011年

Answers:


58

(svn update . && ant clean build start && say done) || say error


1
这是使用shell运算符&&将多个命令链接在一起并用集合||或语句包装起来以引发错误的绝佳示例。确实是+1
bmike

2
真好!为了能够快速执行此操作,我放弃了错误与成功信息,并向zsh:添加了全局别名alias -g sd='; say done'。这意味着我只需要添加sd任何命令,就会收到通知。
wrtsprt

好东西。现在我可以玩些东西
Marco Prins

总是说尝试过的,完成的和错误的:(例子:(echo alik && echo Orly && say done) || say error
AlikElzin-kilaka '16

1
非常便利。我一直在回声,say -v Zarvox这使得附近的每个人都跳了起来,这是一个稍微不那么令人震惊的通知。
Siddhartha

52

在Mac OS 10.8中,您可以向自己发送通知中心消息(类似于Growl,但内置在Mac OS中)。

签出“ 从OS X中的命令行发送警报到通知中心 ”以了解如何安装Ruby gem,它将允许您从命令行发送通知。为了简化只关心终端中完成某件事的常见用例,请在.bash_profile中添加一个别名:

alias notifyDone='terminal-notifier -title "Terminal" -message "Done with task!"'

然后,您可以简单地执行以下操作:

$ <long-running task> ; notifyDone

长时间运行的任务完成后,您将获得一个漂亮的模式弹出窗口,该弹出窗口会一直持续到您单击它为止:

通知中心弹出


10
终端通知程序也可以通过自制程序安装:brew install terminal-notifier。然后就可以写了myCommand && terminal-notifier -message 'finished'。在OS X Yosemite(10.10.1)上测试。
Pwdr

4
您应该运行,myCommand; terminal-notifier -message 'finished'否则如果myCommand失败将不显示通知。
aheuermann

1
很棒的解决方案!顺便说一句,这不会像其他OS X通知那样产生任何声音。有什么解决办法吗?
SexyBeast 2015年

1
@Cupidvogel,您可以添加say命令,例如 my command ; terminal-notifier -message 'finished' ; say finished
Tom Crockett

2
该问题的各种答案给出了更多详细信息:apple.stackexchange.com/questions/57412/…–
Joshua Goldberg,

20

使用低吼

.dmg文件中,查找其他内容,其中包含一个growlnotify二进制文件。安装它,类似于中的/usr/local/bin。然后您可以使用此命令

growlnotify --sticky --appIcon <icon> --message <message> -t <title>

显示一个弹出窗口,像这样:

咆哮


2
我几乎使用了确切的方法,但是我用Prowl扩展了Growl,以便Growl可以将通知推送到我的iPhone。
伊恩·C

3
Mountain Lion的通知中心使Growl不再需要... 有关如何使用它的信息,请参见我的回答
汤姆·克罗基特

16

从Mac OS X Lion 10.7开始,终端提供了一些新的状态指示器来帮助解决此类问题:

在标签中:

  • 活动:最近有输出到终端时,将显示活动指示器(旋转进度指示器)。这使您可以查看它当前是否繁忙或已完成一个漫长的过程。(或者,当然,您可以使用它来告诉它在静默执行一段时间后何时开始产生输出。)

  • 未读:在背景选项卡中显示省略号“…”以指示新的未读文本。选择选项卡后,指示符将清除。

  • 警报:显示“响铃”以指示BEL已何时写入背景选项卡或背景窗口。此外,终端在应用程序图标上显示一个红色标志,指示所有终端中“未读”警报/响铃的数量。如果终端本身在后台,则当响铃时,它也会弹跳其Dock图标。

在最小化的窗口中,Dock图标:

  • 活动:活动通过显示前台进程的名称来指示。

  • 未读:未读文本用省略号表示。

  • 最小化的终端窗口在其Dock图标中显示实时内容。如果您要查找的输出是可识别的(例如,即使是小尺寸的“顶部”显示也很容易识别),这可以用来查看是否有活动,甚至确定终端在做什么。当Dock放大倍数打开或您有较大的Dock空间时,此功能特别有用。

此外,您可以在终端中显示一些内容来引起您的注意(即使在最小化的窗口中也可以看到)。例如:

  • 显示一个大星号: banner \*

  • 反转显示: printf '\e[?5h'

  • 将显示器漆成红色: tput setab 1; tput clear

  • 循环坐下,闪烁屏幕: while true; do printf '\e[?5h'; sleep 1; printf '\e[?5l'; sleep 1; done

还有用于操作窗口的转义代码(移动,设置大小,缩放,最小化等)。您可以缩放“终端”窗口,例如:

printf '\e[9;1t'

有关详细信息,请参见http://invisible-island.net/xterm/ctlseqs/ctlseqs.html上的 “窗口操作” 。

另一种方法是使用AppleScript在单独的窗口中显示警报:

osascript -e 'tell app "System Events" to display alert "Build Completed" message "The checkout and build have completed."'

很好地使用了tput和转义序列-除了标题栏中的滚动消息外,您已经拥有所有内容!
bmike

12

我知道我迟到了这个问题,但我认为可能有一些遗漏的地方可能会有所帮助。我发现,虽然整洁,但是与您的终端对话并不能完全起作用。更好的是这样的更微妙的东西:

http://i.stack.imgur.com/FaZmF.png

正如克里斯指出的那样,当投掷BEL时,Lion几乎没有添加通知徽章。您可以使用以下命令自己将其抛出:

tput bel

因此,如果您正在后台进行一些工作,并且在结束时需要通知,则可以尝试以下操作:

ping -c 5 www.google.com && tput bel &

这会将ping命令作为后台任务运行(挂起并完成此任务),并在完成时发出简单警报。从历史上看,BEL曾被用来使硬件发出“可怕”的哔哔声,但是Lion用“无效命令”声音效果,通知徽章和终端图标在扩展坞中两次弹跳来代替它。


1
printf '\a'相当于tput bel。请注意,如果引起警报的选项卡当前处于活动状态,则终端不会弹跳Dock图标。
Lri 2012年

5

我在这个答案中提出两件事:

  • 使用的选项afplay,播放声音文件,以进行通知。
  • 我的用于报告退出状态和通知的工具。

我有这个脚本~/bin/donebeep

#!/bin/bash
if [ "$@" = 0 ]; then
  afplay -v 2 /System/Library/Sounds/Blow.aiff &
else
  afplay -v 2 /System/Library/Sounds/Sosumi.aiff &
fi

根据参数是否为0,这会播放不同的声音。然后我有了一个别名:

alias donebeep='(savestatus=$?; ~/bin/donebeep $savestatus "$@"; exit $savestatus)'

(它们具有相同的名称是无关紧要的,可能不是一个好主意。)

要在您的示例中使用它,svn update . && ant clean build start; donebeep。请注意,我使用;而不是&&,因此它可以通知我失败和成功。

不了解afplay之前,我曾经say讲过消息。该donebeep脚本的作用是:

#!/bin/bash
say -v Bruce "Done $(basename "$(pwd)"), $@." &

该脚本直接说出退出代码,而不用显示两个不同的消息。它还提到了当前目录的名称(以帮助阐明完成的任务),并且可以通过将参数传递给别名来给其提供其他文字以表示(这就是别名包含"$@"在其中的原因)。请注意尾随,&以便您无需等待语音结束就可以得到提示。


手册页afplay不完整;afplay -h列出所有选项:

Usage:
afplay [option...] audio_file

Options: (may appear before or after arguments)
  {-v | --volume} VOLUME
    set the volume for playback of the file
  {-h | --help}
    print help
  { --leaks}
    run leaks analysis  {-t | --time} TIME
    play for TIME seconds
  {-r | --rate} RATE
    play at playback rate
  {-q | --rQuality} QUALITY
    set the quality used for rate-scaled playback (default is 0 - low quality, 1 - high quality)
  {-d | --debug}
    debug print output

4

您也可以使用“内置说”命令进行通知,例如:说“ ant:build:完成”。请参阅:终端中的人说。



1

ntfy正是为此目的而写的。它是跨平台的,可以在长时间运行的命令完成后自动发送通知。

如果您拥有Python pip(大多数Linux发行版和MacOS都有),请按照以下方法安装它并启用自动通知:

$ sudo pip install ntfy
$ echo 'eval "$(ntfy shell-integration)"' >> ~/.bashrc
$ # restart your shell

http://ntfy.rtfd.io上查看

除此之外,它还可以:

  • 终端处于前台时自动停止通知(默认情况下支持并启用X11,iTerm2和Terminal.app)
  • 发送基于云的通知(推送,Pushbullet和XMPP)
  • 用于在流程结束时发送通知(不是上述的自动支持)
  • 手动发送通知(适用于脚本!)

1

iTerm2具有内置的机制来获取通知,但您必须安装Shell Integration

启动长时间运行的命令时,选择:
编辑>标记和注释>警报>下一个标记时发出警报⌥Option+ ⌘Command+ A

当命令提示符返回时,您可以在以下选项之间进行选择:

  • 显示模式警报框
  • 发布通知(示例屏幕截图)


0

Ubuntu在〜/ .bashrc中提供以下别名:

alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

这样,您就可以执行以下操作:

make; alert
sleep 10; alert

也许notify-send在Mac OSX中有等效功能?我在Mac和Ubuntu中都看到过类似的弹出窗口。


您在Apple网站上。为了使这个答案,请解释如何得到notify-sendMac OS X上
丹尼尔·贝克

4
我同意这是不合适的,但实际上我发现这很有帮助。我是从Google提出这个问题的,最初的问题不是Mac专用的。像原始海报一样,我希望有一种方法可以在运行需要很长时间的命令时不必监视终端。我碰巧正在使用Ubuntu:/
allyourcode '04

0

声音和模式窗口的问题是我无法分辨它们的来源。我目前使用一堆空间,有时会超过20个终端窗口。

我的解决方案可移植到Unix端,并且可以与任何支持ansi转义序列的东西一起使用。此解决方案可与Snow Leopard配合使用,并且可能会与更旧的终端版本配合使用。

.bash_profile中的单行

function watch { $* ; echo -n -e "\033[41m" ;  echo $* DONE ;  date ;  echo -n -e "\033[0m" ; }

分解:

$* expands to the original command I want to watch.
first escape sequence changes background color to red
echo repeats the command (with red background, the word DONE.
Running Date tells you when it finished.
last escape resets the terminal to what it was.

如果您不喜欢红色,则google ascii转义码为背景色。请注意,这不会将整个屏幕更改为红色,而只会更改命令完成后的所有输出。



0

这是我的bash函数(只需将其放在您~/.bashrc或中的任何位置~/.zshrc

watch(){
  cmd=$@ # Somehow interpolate $@ directly doesn't work.
  $@ && say 'Watch Completed!' && osascript -e "display notification \"Completed: $cmd\" with title \"Watch Alert\""
}

要使用它: watch echo 'hi there'

您还可以按照此处记录的内容自定义通知声音:https : //apple.stackexchange.com/a/115373/9622


0

我一直在做这种事情。我的命令行可能看起来像

$ rm Gemfile.lock && bin/setup && bundle install --binstubs && say "All"; say "done"

如果bin/setupbundle install命令成功完成,我将听到系统/命令语音说“全部完成”。如果前两个错误中的任何一个错误,则&&不会遵循该链,而我将听到的只是“完成”。


0

您可以使用内置osascript命令来运行显示通知的Apple脚本,例如

osascript -e 'display notification "Command done" with title "Your title here"'

您可以使用简单的分号将其串起来,例如

your-command ; osascript -e '....'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.