我正在命令行上运行一系列命令,大约需要20分钟才能完成。我想在Mac上看到完成后的某种通知,因此不需要监视终端的完成时间。有没有办法做到这一点?
$ svn update . && ant clean build start && *notify_me_somehow*
编辑:
我可以使用,xclock
但这似乎是一个hack。理想情况下,我可以将通知发送到任何地方,例如手机,屏幕等。
我正在命令行上运行一系列命令,大约需要20分钟才能完成。我想在Mac上看到完成后的某种通知,因此不需要监视终端的完成时间。有没有办法做到这一点?
$ svn update . && ant clean build start && *notify_me_somehow*
编辑:
我可以使用,xclock
但这似乎是一个hack。理想情况下,我可以将通知发送到任何地方,例如手机,屏幕等。
Answers:
(svn update . && ant clean build start && say done) || say error
&&
将多个命令链接在一起并用集合||
或语句包装起来以引发错误的绝佳示例。确实是+1
alias -g sd='; say done'
。这意味着我只需要添加sd
任何命令,就会收到通知。
(echo alik && echo Orly && say done) || say error
say -v Zarvox
这使得附近的每个人都跳了起来,这是一个稍微不那么令人震惊的通知。
在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
长时间运行的任务完成后,您将获得一个漂亮的模式弹出窗口,该弹出窗口会一直持续到您单击它为止:
myCommand; terminal-notifier -message 'finished'
否则如果myCommand
失败将不显示通知。
say
命令,例如 my command ; terminal-notifier -message 'finished' ; say finished
使用低吼。
在.dmg
文件中,查找其他内容,其中包含一个growlnotify二进制文件。安装它,类似于中的/usr/local/bin
。然后您可以使用此命令
growlnotify --sticky --appIcon <icon> --message <message> -t <title>
显示一个弹出窗口,像这样:
从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."'
我知道我迟到了这个问题,但我认为可能有一些遗漏的地方可能会有所帮助。我发现,虽然整洁,但是与您的终端对话并不能完全起作用。更好的是这样的更微妙的东西:
正如克里斯指出的那样,当投掷BEL时,Lion几乎没有添加通知徽章。您可以使用以下命令自己将其抛出:
tput bel
因此,如果您正在后台进行一些工作,并且在结束时需要通知,则可以尝试以下操作:
ping -c 5 www.google.com && tput bel &
这会将ping命令作为后台任务运行(挂起并完成此任务),并在完成时发出简单警报。从历史上看,BEL曾被用来使硬件发出“可怕”的哔哔声,但是Lion用“无效命令”声音效果,通知徽章和终端图标在扩展坞中两次弹跳来代替它。
printf '\a'
相当于tput bel
。请注意,如果引起警报的选项卡当前处于活动状态,则终端不会弹跳Dock图标。
我在这个答案中提出两件事:
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
我创建了一个简单的工具来执行此操作。https://github.com/vikfroberg/brb
安装
需要安装Node.js:http://nodejs.org
$ npm install -g brb
使用说明
$ sleep 3; brb
我ntfy
正是为此目的而写的。它是跨平台的,可以在长时间运行的命令完成后自动发送通知。
如果您拥有Python pip
(大多数Linux发行版和MacOS都有),请按照以下方法安装它并启用自动通知:
$ sudo pip install ntfy
$ echo 'eval "$(ntfy shell-integration)"' >> ~/.bashrc
$ # restart your shell
除此之外,它还可以:
iTerm2具有内置的机制来获取通知,但您必须安装Shell Integration。
启动长时间运行的命令时,选择:
编辑>标记和注释>警报>下一个标记时发出警报(⌥Option
+ ⌘Command
+ A
)
当命令提示符返回时,您可以在以下选项之间进行选择:
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中都看到过类似的弹出窗口。
notify-send
Mac OS X上
声音和模式窗口的问题是我无法分辨它们的来源。我目前使用一堆空间,有时会超过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转义码为背景色。请注意,这不会将整个屏幕更改为红色,而只会更改命令完成后的所有输出。
我编写了一个脚本来解决这个问题。您不需要任何其他软件。安装方式:
brew install akashaggarwal7/tools/tsay
用法:
sleep 5; tsay
随时贡献!
这是我的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
grownlnotify
。