コマンドが完了したときに通知を受け取る方法


64

コマンドラインで一連のコマンドを実行していますが、完了までに約20分かかります。これらが終了したときにMacで何らかの通知を表示したいので、終了時に端末を監視する必要はありません。これを行う方法はありますか?

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

編集

使用できますxclockが、これはハックのようです。理想的には、電話、画面など、どこにでも通知を送信できます。


2
あなたはコマンドラインにいますが、ここでの答えは実際にはMac固有のものであり、Unix / Linux関連ではないと思います。おそらくGrowlとを使用したいと思うからですgrownlnotify

少なくとも私のボックスでは、それは組み込みコマンドではありません。

growl.info Growlは、@ mattdmによって参照されるプログラムです。
jsbillings

回答:


58

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


1
これは、シェル演算子&&を使用して複数のコマンドを連結し、集合||またはステートメントでラップしてエラーを発生させる素晴らしい例です。確かに+1
bmike

2
いいね!ただし、これをすばやく行うには、エラーと成功の情報を放棄し、zsh:にグローバルエイリアスを追加しましたalias -g sd='; say done'。これはsd、コマンドに追加するだけで通知されることを意味します。
wrtsprt 14年

良いですね。そして今、私は遊びたいことがあります
マルコプリンス

試したの両方が行われ、エラーが常に言われている:(例:(echo alik && echo Orly && say done) || say error
AlikElzin-kilaka

1
とても便利な。私はsay -v Zarvox、近くの全員がジャンプするようにエコーしてきましたが、これは少し警戒の少ない通知です。
シッダールタ

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
terminal-notifierhomebrew経由でインストールできます:brew install terminal-notifier。その後、あなたは書くことができますmyCommand && terminal-notifier -message 'finished'。OS X Yosemite(10.10.1)でテスト済み。
Pwdr 14

4
実行しmyCommand; terminal-notifier -message 'finished'ないと、myCommand失敗した場合に通知が表示されません。
アホイアーマン

1
素晴らしい解決策!ところで、これは他のOS X通知のような音を出しません。そのための解決策はありますか?
SexyBeast

1
あなただけ追加することができます@Cupidvogel sayコマンド、例えば my command ; terminal-notifier -message 'finished' ; say finished
トム・クロケット

2
この質問に対するさまざまな回答により多くの詳細が提供されます。apple.stackexchange.com
ジョシュアゴールドバーグ

20

Growlを使用します。

.dmg、ファイル、エキストラを探し、growlnotifyバイナリがあります。のようにインストールします/usr/local/bin。次に、このコマンドを使用できます

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

そのようなポップアップを表示するには:

うなり声


2
私はほぼこの正確なアプローチを使用しますが、Growlが通知をiPhoneにプッシュできるように、Growl をProwlで拡張します。
イアンC.

3
マウンテンライオンの通知センターを使用すると 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が投げられたとき、ライオンは小さな通知バッジを追加しました。次のコマンドを使用して、自分でこれをスローできます。

tput bel

そのため、バックグラウンドで何らかの作業を行っており、終了時に通知が必要な場合は、次のようなことを試すことができます。

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

これにより、pingコマンドがバックグラウンドタスクとして実行され(ハング&完了)、終了時に簡単なアラートがスローされます。歴史的にBELはその[恐ろしい]ハードウェアのビープ音を鳴らすために使用されてきましたが、Lionはそれを「無効なコマンド」サウンドエフェクト、通知バッジ、ドックで2回バウンスする端末アイコンで上品に置き換えました。


1
printf '\a'はと同等tput belです。警告の原因となったタブが現在アクティブな場合、ターミナルはDockアイコンをバウンスしないことに注意してください。
Lri

5

この回答では、2つのことを示します。

  • 通知に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)"), $@." &

このスクリプトは、2つの異なるメッセージを表示する代わりに、終了コードを直接読み上げます。また、現在のディレクトリの名前(言及されているタスクを明確にするため)に言及し、エイリアスにパラメーターを渡すことで追加のテキストを与えることができます(そのため、エイリアスに含ま"$@"れています)。&プロンプトが表示される前にスピーチが終了するのを待つ必要がないように、末尾に注意してください。


manページ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:done」と言うと、通知のためにsayコマンドでビルドを使用することもできます。参照:ターミナルで言う人。



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はデフォルトでサポートおよび有効化されています)
  • クラウドベースの通知を送信する(プッシュオーバー、プッシュブレット、およびXMPP)
  • プロセスの終了時に通知を送信するために使用されます(前述の自動サポートではありません)
  • 手動で通知を送信します(スクリプトでの使用に適しています!)

1

iTerm2には通知を取得するための組み込みメカニズムがありますが、シェル統合をインストールする必要があります。

長期実行コマンドを開始するときは、次を選択します:
編集>マークと注釈>アラート>次のマークでアラート⌥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-sendMac OSXに相当するものがありますか?MacとUbuntuの両方で、同様のポップアップウィンドウを見ました。


あなたはアップルのサイトにいます。この回答にするために、取得する方法を説明してくださいnotify-sendのMac OS X上で
ダニエル・ベック

4
これは一種の不適切であることに同意しますが、実際にはこれが有用であることがわかりました。Googleからこの質問に来ましたが、元の質問はMac固有のものではありませんでした。元のポスターのように、長時間かかるコマンドを実行するときに端末を監視する必要がない方法が必要です。私はたまたまUbuntuを使用しています:/
allyourcode

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

ここにあるこれを解決するスクリプトを作りました。このために追加のソフトウェアは必要ありません。インストール:
brew install akashaggarwal7/tools/tsay
使用法:
sleep 5; tsay

気軽に貢献してください!


ダウン投票の理由は?
アカシュア

0

これが私のbash関数です(あなたの~/.bashrcorのどこかに置くだけ~/.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コマンドが正常に完了すると、システム/ディクテーションの音声で「すべて完了」という音声が聞こえます。最初の2つのエラーのいずれかが発生した場合、&&チェーンは追跡されず、「完了」だけが聞こえます。


0

組み込みosascriptコマンドを使用して、通知を表示するApple Scriptを実行できます。たとえば、

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

単純なセミコロンで文字列をつなぐことができます。例えば

your-command ; osascript -e '....'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.