236
ちょっと時間がかかるテストを回しながら開発しています。

```

    $ python tests.py
    
```

テストが走っている間に次のテストを書いたりして時間の埋め合わせをしていますが、テストが終わったら前回変えたところを忘れないうちにすぐにテスト結果を見て対処したいです。

テストを実行するコマンドが終了したらビープ音か何かを鳴らせばいいかと思うのですが、どうすればいいでしょうか。

SSH越しのシェルでも動作するような方法がよいです。

おまけでコマンドの終了コードが 0 かそうでないかによって別の音 (ビープ音の数が違うのでもよい) にできればさらによいです。(補足:
ただし、音は終了コードに関わらず常に鳴らしたい)
CC BY-SA 3.0
2014-12-02T05:29:17.280
230
2014-12-18T00:21:18.377
2014-12-03T01:28:29.170
30
30
question
bash macos
コマンドが終了したら音を鳴らしたい
シェクスクリプトで実行してからechoでビープ音文字を出力すればよいと思います。 実行結果は$?に入るのでそれを判定して音を鳴らす回数を変える事も出来ます。

```

    #!/bin/sh
    python tests.py
    
    if [ $? -eq 0 ]; then
       echo $'\a' #戻り値が０なら1回ビープ音
    else
       echo $'\a\a\a' #それ以外では３回ビープ音
    fi
    
```
CC BY-SA 3.0
2014-12-02T05:37:44.127
234
2014-12-02T06:30:24.903
2014-12-02T06:30:24.903
525
525
230
answer
一度ビープ音を鳴らしたいのであれば次のようにすればよいかと思います．

```

    echo ^G
    
```

「^G」を入力するのには `C-v C-g` とタイプすればよいかと思います．
またはターミナルエミュレータの機能で出力があれば知らせるものもあるようです（[Konsole](https://konsole.kde.org/)など）．

追記：

```

    python test.py && echo ^G || (echo ^G; sleep 1; echo ^G)
    
```

ワンライナーがお好きなら，こう書くと正常終了時には一回，異常終了時には二回ビープが鳴るようにできます．単に成功失敗問わず鳴らしたいということならば

```

    python test.py; echo ^G
    
```

です．
CC BY-SA 3.0
2014-12-02T05:41:45.443
236
2014-12-02T09:28:30.930
2014-12-02T09:28:30.930
535
535
230
answer
テストが失敗した場合に音を鳴らすのであれば

```

    python test.py || echo ^G
    
```

とします。`^G` は `CTRL-V` `CTRL-G` で入力します。
CC BY-SA 3.0
2014-12-02T05:56:55.313
237
2014-12-02T05:56:55.313
440
230
answer
Macの場合、sayコマンドが使用できます。自分は長いmakeビルドなどが終わったことを知らせるのに、sayコマンドを使っています

```

    make && say Done
    
```

日本語の音声もつかえるので、日本語を喋らせても面白いです

```

    make && say -v Otoya "終わったよ！"
    
```
CC BY-SA 3.0
2014-12-03T00:45:28.763
281
2014-12-03T00:45:28.763
264
230
answer
DVDトレイを出し入れするejectコマンドを利用するのはどうでしょうか。

Raspberry Piでのやり方:

```

    /usr/bin/eject -T
    
```

色々な利用例: <http://www.slideshare.net/Akkiesoft/20140927-ejecthandson>
CC BY-SA 3.0
2014-12-09T09:02:03.950
484
2014-12-09T15:28:01.097
2014-12-09T15:28:01.097
30
972
230
answer
システムで利用されている AIFF を使いリッチな音を再生するという方法もあります。

例

```

    afplay /System/Library/Components/CoreAudio.component/Contents/SharedSupport/SystemSounds/system/burn\ complete.aif
    
```

他にも
`/System/Library/Components/CoreAudio.component/Contents/SharedSupport/SystemSounds`
にいくつか使えそうな音があります。
CC BY-SA 3.0
2014-12-09T09:43:34.123
485
2014-12-09T09:43:34.123
973
230
answer
`^G` を出力する例ばかりですが、移植性を考慮するなら tput を用いるべきです。

```

    $ python test.py; tput bel
    
```

ベルを鳴らし続ける例:

```

    $ python test.py; while :; do tput bel;sleep 1; done
    
```

`bel` など端末の機能名については Linux や *BSD ならオンラインマニュアル `terminfo`(5) の「Cap-
name」あたりを見てください。

次のようなエイリアスを作っておくといいかもしれません。

```

    $ alias alarm='e=$?; s=2; [ $e -ne 0 ] && { echo exit $e 1>&2; let s--; }; while :; do tput bel; sleep $s; done'
    $ python test.py; alarm
    
```

この例のエイリアスコマンド `alarm` は、 直前のコマンドの終了コードが 0
の場合は2秒おきにベルを鳴らし、それ以外の場合は終了コードを表示して1秒おきにベルを鳴らします。
CC BY-SA 3.0
2014-12-16T05:31:05.980
1674
2014-12-16T10:52:30.777
2014-12-16T10:52:30.777
3061
3061
230
answer
音を鳴らす方法は他の方にお譲りして、私は別の角度からコメントします。コマンドを実行してしばらくしてから「時間かかるなぁ、これが終わった時に音を鳴らしたいなぁ」と後から思うことがよくあります。でも実行を中断して`;
[音を鳴らすコマンド]`をつけて実行し直すのは、これまでせっかく計算してきたのに時間が無駄になってしまいます。そういう時は、私は`ps`を使っています。プロセスIDをpsで調べてからそのプロセスがある間はwhileループを回します。

```

    python tests.py
    # ...
    # 時間がかかるなぁ...
    # 中断するのもったいないなぁ...
    
    # 別の端末を立ち上げて
    ps # PIDを見る
    while ps PID >/dev/null; do sleep 1; done; echo "done" # 音を鳴らしたり、出力ファイルを処理するなど
    
```
CC BY-SA 3.0
2014-12-16T10:24:53.217
1735
2014-12-16T14:14:44.347
2014-12-16T14:14:44.347
3822
3822
230
answer
同じように音を鳴らす設定にしていたことがありますが、トイレなどに立つと音を聞き逃すため、OS X の Notification Center
を使うという方法にしたことがあります。

terminal-notifier というアプリケーションを入れ、 <https://github.com/alloy/terminal-notifier>

```

    >>> import os
    >>> os.system('/Applications/terminal-notifier.app/Contents/MacOS/terminal-notifier -message Done')
    
```

などを Python 側から呼べば、Mac の画面に通知が出ます (os-x のタグがついているので、Mac を想定します)。

もし `tests.py` の走っている Mac が他の Mac であれば、SSH を使うことで解決できます。通知を受け取りたい側の Mac に
terminal-notifier をインストールし、`tests.py` の中から、スクリプト終了時に SSH を呼び出します。

```

    import os
    os.system("ssh YOUR_USER_NAME@YOUR_HOST /Applications/terminal-notifier.app/Contents/MacOS/terminal-notifier -message Done")
    
```

SSH を使う場合は、パスワード入力をしなくても良いように設定して下さい。
CC BY-SA 3.0
2014-12-16T15:36:51.013
1794
2014-12-16T15:36:51.013
4070
230
answer
コマンドラインでいちいち`echo
^G`をつけるのは忘れてしまいますので、テストを走らせるシェルのプロンプトに`^G`を仕込むのはどうでしょう。あるいは``command``で何かコマンド
(別の方が書いていらっしゃるように通知コマンドなど) をプロンプトに仕込んでおいて起動することも出来ます。
CC BY-SA 3.0
2014-12-18T00:21:18.377
1951
2014-12-18T00:21:18.377
3413
230
answer